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源码分析
最新推荐文章于 2024-10-27 21:37:07 发布
本文深入探讨了ArrayList和LinkedList在Java中的实现和性能差异。ArrayList在初始化时不创建数组,首次添加元素时会创建大小为10的数组,并在需要时以1.5倍的速度扩容。而LinkedList作为双向列表,添加元素无需扩容,适合频繁的插入和删除操作。理解这两种数据结构的内部工作机制对于优化程序性能至关重要。
1307

被折叠的 条评论
为什么被折叠?



