java.util.ArrayList
1. 内部由elementData对象数组存储数据
transient Object[] elementData;
2. 初始大小10
private static final int DEFAULT_CAPACITY = 10;
3. add()时
- ensureCapacityInternal(size + 1)
确保容量足够和扩容,
扩容,初始10,每次增加的容量为原容量的一半,即第一次扩容后15,第二次是22,第三次33,直到 Integer.MAX_VALUE - 8时会一次分配最大容量,关键代码如下:
newCapacity = oldCapacity + (oldCapacity >> 1); //每次扩容
if (newCapacity - MAX_ARRAY_SIZE > 0) //最大扩容
newCapacity = hugeCapacity(minCapacity);
return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
- 存储对象
elementData[size++] = e; //size++ 线程不安全
4. hashCode() 继承AbstractList.hashCode()
for (E e : this)
hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());//每个ArrayList内的元素都参与计算
5. 增删改查效率,参考对数组的操作