1. List
ArrayList
- 本质就是一个数组
- 初识化大小默认为 10
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
- 每次扩容后大小变为原大小的1.5倍
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容为1.5倍大小
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
- 使用
for(Object o : list)
迭代器进行迭代循环的时候不应该对列表list
进行新增或者删除操作,否则会报ConcurrentModificationException
异常,原因是因为迭代过程中会检查变量数量和期望的数量是否一致。
如以下操作就会报错
int i=0;
for (Object o : list) {
if(i==0) list.add("neco");
i++;
}
抛出异常的代码
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
LinkedList
- 本质就是一个链表,没有什么特殊的内容
- 里边的Node<E>是支持双向链表的
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
CopyOnWriteArrayList
- 在写的时候复制了一份出来,然后重新写入数据