List可以分爲ArrayList,LinkedList,Vector等分支。List的特性是可重複數據,有序。
ArrayList的底層實現是數組,默認容量爲10,當需要擴容時,會變爲原來容量的1.5倍。因爲是數組實現,ArrayList適合查找數據。
/**
* Default initial capacity. 默認容量爲10
*/
private static final int DEFAULT_CAPACITY = 10;
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
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); //原本容量右移一位,縮小爲原來的一半,加上原 容量本身,即變爲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);
}
LinkedList靠鏈表實現,默認容量是0,其中有addFirst()和addLast(),add()默認使用addLast()。
transient int size = 0; //默認容量
public boolean add(E e) { //默認add方法添加到鏈表尾部
linkLast(e);
return true;
}
Vector也是通過數組實現的,相比較於ArrayList,這種集合線程安全,但速度較慢。默認容量也爲10,但擴容時會變爲原來的2倍。