2021年12月3日Java基础面试题30道
1.如果需要从一个List集合中频繁的删除和添加元素,应选用ArrayList还是LinkedList?
ArrayList基于Object数组,需要连续的内存空间来储存数据,因为数组支持下标,所以ArrayList的随机访问速度很快,但是删除和插入操作需要进行移位操作,导致效率低。所以ArrayList适合查询多,插入删除操作少的场景
LinkedList基于链表,属于链式储存结构,它的元素储存位置可以在物理位置上不连续,因为每个元素保存了相邻元素的指针,链表不支持索引,所以随机访问只能遍历,效率低。
而删除和插入操作只需要更改相邻元素的指针即可,不涉及移位,效率高,所以LinkedList适合删除和插入操作多,查询少的场景
2.hashmap是线程安全的吗,在多线程环境中应使用哪个集合?
hashmap的线程不是安全的,在多线程高并发情况下可能会出现并发问题:比如hashmap扩容死循环,读写数据发生数据异常
高并发环境下应使用concurrenthashmap
3.什么是单例模式,如何实现?
单例模式就是一个类只能有一个实例
饿汉模式,懒汉模式(双重校验锁+volatile变量),枚举、静态内部类
4.模板模式
就是父类中定义好了算法的框架,由子类去实现一个或多个的业务,子类可以在不破坏父类框架的前提下,重新定义算法的某些实现步骤
5.适配器模式
就是将不兼容的接口转换成可兼容的接口的中间类
比如HandlerIntercptorAdaptor就采用了适配器模式,我们自定义构造器不需要去实现HandlerInterceptor接口并重新所有方法,只需要继承适配类中重写需要的方法即可
但是在jdk1.8以后,接口就支持默认方法了,适配器模式就失去作用了
6.什么是代理模式、有几种代理模式
代理模式就是直接使用实际对象,而是代理对象持有实际对象的引用,由代理对象间接调用实际对象的方法。代理模式的主要作用就是为了增强实际对象的功能。代理模式分为静态代理,jdk动态代理,cglib动态代理
7.spring使用的是那种代理模式
如果被代理对象实现了接口,默认使用jdk动态代理,代理类会实现和被代理对象相同的接口,保证和被代理对象拥有相同的方法
如果被代理对象没有实现接口,那么就会使用cglib动态代理,它是通过继承被代理类来保证相同的方法
8.jdk动态代理和cglib动态代理的区别
jdk动态代理是jdk自带的,而cglib则需要依靠第三方库
jdk动态代理是通过反射去生成一个实现代理代理接口的对象,在调用目标方法前调用InvokeHandler来处理
而cglib则是先加载目标类的class文件,再通过ASM框架来修改其字节码生成子类实现的
9.为什么要使用代理模式
在开发中,有时候需要增加一个功能,但是我们不能直接去修改目标类 ,这个时候使用代理模式就能很好解决这个问题,为目标对象创建一个代理对象,通过代理对象来增强功能。

浙公网安备 33010602011771号