ArrayList:初始化时没有直接创建存储数据的数组,在第一次添加元素时,会创建长度为10的数组,当数组长度不够用时,会自动扩容,每次扩容1.5倍,对象创建时类似于单例中的懒汉式,延迟数组的创建,节省了内存空间。
//扩容方法
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//每次扩容1.5倍
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: 不需要扩容,底层为双向列表。
//添加元素的核心代码
void linkLast(E e) {
final Node<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
ArrayList和LinkedList源码分析
最新推荐文章于 2023-09-01 20:55:49 发布