当前位置:首页 - 博客 - 正文

ArrayList常见面试题

1、ArrayList是什么?可以用来干嘛?
  1. ArrayList底层基于数组实现,只能存放对象(底层是Object数组Object[] elementData,所以基本数据类型都会装箱(int->Integer))
  2. ArrayList 允许空值和重复元素
  3. ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的异常或错误。
2、ArrayList与LinkedList的区别?
  1. ArrayList底层是数组实现,LinkedList底层是链表实现。所以ArrayList的查找和访问元素的速度比LinkedList快,ArrayList新增,删除比LinkedList
  2. ArrayList需要一份连续的内存空间,LinkedList不需要连续的内存空间(特别地,当创建一个ArrayList集合的时候,连续的内存空间必须要大于等于创建的容量)
  3. 两者都是线程不安全的
3、ArrayList线程不安全解决办法
  1. // 使用下面三个替代
  2. Vector
  3. Collections.synchronizedList(new ArrayList<>());
  4. CopyOnWriteArrayList

Vector,Collections.synchronizedList()原理都是给方法套个synchronized
CopyOnWriteArrayList使用了写时复制,写的时候重新复制数组,然后数组空间加一,复制数组赋值时使用ReentrantLock

4、1.7和1.8版本初始化的区别

JDK1.7

  1. 相当于设计模式中的饿汉式 第一次创建无参构造器时就创建一个初始容量为10的数组

JDK1.8

  1. 相当于涉及模式中的懒汉式 ArrayList可以通过构造⽅法在初始化的时候指定底层数组的⼤⼩。 通过⽆参构造⽅法的⽅式ArrayList()初始化,则赋值底层数Object[] elementData为⼀个默认空数组
  2. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  3. 所以数组容量为0,只有真正对数据进⾏添加add时,才分配默认DEFAULT_CAPACITY = 10的初始容量。