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不是线程安全的集合!如需确保线程安全,,但是相对于ArrayList效率相对较低。
-
而Vector相对于ArrayList线程安全的原因在于它add()集合添加元素的方法:
// 可以看出Vector的add方法加上了synchronized 同步关键字 public synchronized void addElement(E obj) { modCount ; ensureCapacityHelper(elementCount 1); elementData[elementCount ] = obj; }
1.5–ArrayList如何并发修改而不出现异常并发修改?
为解决此问题呢,java引入了一个可以保证读和写都是线程安全的集合(读写分离集合):
因此,解决方案是:
// private static ArrayList<String> 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 不一定比ArrayList慢
- 对于随机操作,LinkedList 效率明显低于LinkedList