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倍。