共计 821 个字符,预计需要花费 3 分钟才能阅读完成。
ArrayList 与 LinkedList
ArrayList是线程不平安的
public boolean add(E e) {ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
察看 add 办法能够看出当在多线程的状况下,insert modCount 的办法是可能存在线程抵触的。
为什么 ArrayList 还要实现 RandomAccess 接口?
RandomAccess 接口实际上就是一个标识,它代表着 ArrayList 是反对快速访问性能的
- 实现 RandomAccess 的 list 优先用 for 循环 其次是 foreach
- 未实现的话 优先 iterator 遍历(foreach 底层也是这个实现的)大 size 不能够 for 循环
arrayList的底层实现是 Object 数组,所以 add(E e)办法的工夫复杂度是 O(1)
如果是 add(int index, E e)工夫复杂度就是 O(n – i),因为要把前面的元素往后移一位
因为是数组实现的 所以 ArrayList 反对快速访问 get(int index)
ArrayList和 Vector 相比,Vector 是线程平安的 然而同样也导致线程拜访 Vector 会在同步上破费大量工夫
与 ArrayList 对应的就是LinkedList
LinkedList 同样是线程不平安的
public boolean add(E e) {linkLast(e);
return true;
}
看源码可知,这里没有对多线程做任何预防
LinkedList 的底层是双向链表实现的,所以新增删除的工夫复杂度是 O(1), 而带 index 的新增则为 O(n), 因为要挪动到这个地位,
LinkedList 是不反对快速访问的,链表嘛
和 ArrayList 不一样,数组实现的话须要预留很多多余的空间,然而链表除了自身的大小其余没有多余空间节约
本文由博客一文多发平台 OpenWrite 公布!
正文完