ArrayList扩容规则
时间:2022-09-25 01:30:00
1----ArrayList
1.1—ArrayList如何扩容?
- 第一次扩容10,以后每次扩容1.5倍,扩容通过位运算右移1位。
1.2—ArrayList 如何处理频繁扩容导致添加性能急剧下降?
- 若需要将大量数据添加到集合中,则提前定义ArrayList收集的初始容量不需要花费大量时间在自动扩时间
1.3—ArrayList插入或删除元素是否一定比例LinkedList慢?
- 在集合里面插入元素速度比对结果为:第一次插入,LinkedList中间和尾部插入,ArrayList更快;
- 在集合里面删除元素相似,第一部删除,LinkedList更快;中间删除和尾部删除,ArrayList更快;
1.4— ArrayList 线程安全吗?
-
因此,得出结论,ArrayList不是线程安全的集合!如需确保线程安全,建议使用Vector集合,线程安全,但是相对于ArrayList效率相对较低。
-
而Vector相对于ArrayList线程安全的原因在于它add()集合添加元素的方法:
// 可以看出Vector的add方法加上了synchronized 同步关键字 public synchronized void addElement(E obj) { modCount ; ensureCapacityHelper(elementCount 1); elementData[elementCount ] = obj; }
1.5–ArrayList如何并发修改而不出现异常并发修改?
为解决此问题呢,java引入了一个可以保证读和写都是线程安全的集合(读写分离集合):CopyOnWriteArrayList
因此,解决方案是:
// private static ArrayList list = new ArrayList<>(); // 用读写分离集合替换原来的ArrayList private static CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<String>(); static {
list.add("Jack"); list.add("Amy"); list.add("Lucy"); }
1.6—ArrayList和LinkedList 的区别?
-
ArrayList
- 基于动态数组的数据结构
- 随机访问get和set,其效率优于LinkedList
- 随机操作add和remove,ArrayList不一定比LinkedList慢(ArrayList底层不是每次都是动态数组add和remove都需要创建新数组)
-
LinkedList
- 基于链表的数据结构
- 顺序操作,LinkedList 不一定比ArrayList慢
- 对于随机操作,LinkedList 效率明显低于LinkedList