Collection
Collection接口是父接口,有两个子接口:
-
List:接口:有序,可重复
常用的有三个实现类:
- ArrayList:底层是数组,数据不安全
- Vector:底层是数组,数据安全
- LinkedList:底层是链表 -
Set:无序,不可重复
ArrayList扩容的原理:
查看源码步骤:
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
***int newCapacity = oldCapacity + (oldCapacity >> 1);***
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);
}
int newCapacity = oldCapacity + (oldCapacity >> 1):这句就是扩充的原理oldCapacity 是老的长度,(>>)右移表示除以2,扩充1.5倍;
elementData = Arrays.copyOf(elementData, newCapacity);
然后 进行数组拷贝;扩充完毕;