1、ArrayList是什么?可以用来干嘛?
ArrayList底层基于数组实现,只能存放对象(底层是Object数组Object[] elementData,所以基本数据类型都会装箱(int->Integer))
ArrayList 允许空值和重复元素
ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的异常或错误。
2、ArrayList与LinkedList的区别?
ArrayList底层是数组实现,LinkedList底层是链表实现。所以ArrayList的查找和访问元素的速度比LinkedList快,ArrayList新增,删除比LinkedList慢
ArrayList需要一份连续的内存空间,LinkedList不需要连续的内存空间(特别地,当创建一个ArrayList集合的时候,连续的内存空间必须要大于等于创建的容量)
两者都是线程不安全的
3、ArrayList线程不安全解决办法
// 使用下面三个替代
Vector
Collections.synchronizedList(new ArrayList<>());
CopyOnWriteArrayList
Vector,Collections.synchronizedList()原理都是给方法套个synchronized
CopyOnWriteArrayList使用了写时复制,写的时候重新复制数组,然后数组空间加一,复制数组赋值时使用ReentrantLock
4、1.7和1.8版本初始化的区别
JDK1.7
相当于设计模式中的饿汉式 第一次创建无参构造器时就创建一个初始容量为10的数组
JDK1.8
相当于涉及模式中的懒汉式 ArrayList可以通过构造⽅法在初始化的时候指定底层数组的⼤⼩。 通过⽆参构造⽅法的⽅式ArrayList()初始化,则赋值底层数Object[] elementData为⼀个默认空数组 :
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
所以数组容量为0,只有真正对数据进⾏添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。