ArrayList 初始容量是多少?
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
ArrayList 是如何扩容的? 每次扩容多大?
ArrayList 的扩容是通过 Arrays.copy 来实现的, 底层是通过 native 方法, 即 c++ 来实现数组的复制的.
每次扩容的大小从源码中可看出, 每次扩容原来容量的一半.
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
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);
}
LinkedList 的底层数据结构是单向链表还是双向链表?
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;
}
}
从 LinkedList 的底层数据结构中明显可以看出为双向链表.