- 第一次扩容10,以后每次都扩容原容量的1.5倍,扩容通过位运算右移动1位。
- 如果在大量数据需要添加到集合中的时候,提前定义ArrayList集合的初始容量,从而不用花费大量时间在自动扩容上
- 在集合里面插入元素速度比对结果是:首部插入,LinkedList更快;中间和尾部插入,ArrayList更快;
- 在集合里面删除元素类似,首部删除,LinkedList更快;中间删除和尾部删除,ArrayList更快;
-
因此,得出结论,ArrayList并不是线程安全的集合!如果需要保证线程安全,建议使用Vector集合,其是线程安全的,但是相对于ArrayList来说,效率比较低。
-
而Vector相对于ArrayList之所以是线程安全的,就在于其add()为集合添加元素的方法:
// 可以看出Vector的add方法加上了synchronized 同步关键字 public synchronized void addElement(E obj) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj; }
为解决此问题呢,java引入了一个可以保证读和写都是线程安全的集合(读写分离集合):CopyOnWriteArrayList
所以解决方案就是:
// private static ArrayList1.6—ArrayList和LinkedList 的区别?list = new ArrayList<>(); // 使用读写分离集合替换掉原来的ArrayList private static CopyOnWriteArrayList list = new CopyOnWriteArrayList (); static { list.add("Jack"); list.add("Amy"); list.add("Lucy"); }
-
ArrayList
- 基于动态数组的数据结构
- 对于随机访问的get和set,其效率优于LinkedList
- 对于随机操作的add和remove,ArrayList不一定比LinkedList慢(ArrayList底层由于是动态数组,因此并不是每一次add和remove都需要创建新数组)
-
LinkedList
- 基于链表的数据结构
- 对于顺序操作,LinkedList 不一定比ArrayList慢
- 对于随机操作,LinkedList 效率明显低于LinkedList



