1. ArrayList与LinkedList的本质区别
在Java集合框架中,ArrayList和LinkedList是最常用的两种List实现,但它们的内部工作机制截然不同。理解这个区别对于写出高性能代码至关重要,也是面试中经常被深挖的知识点。
ArrayList底层采用动态数组结构,这意味着它在内存中是连续存储的。当我们创建一个ArrayList时,默认会初始化一个长度为10的数组(JDK8+)。随着元素不断增加,当数组容量不足时会触发扩容机制,新容量通常是原容量的1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1))。这个扩容过程涉及数组拷贝,所以add操作的最坏时间复杂度是O(n)。
java复制// ArrayList扩容核心代码(JDK17)
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
相比之下,LinkedList采用双向链表结构,每个元素(Node)都保存了指向前驱和后继的引用。这种结构不要求内存连续,添加元素时只需调整相邻节点的指针,不需要考虑扩容问题。但每个元素需要
