面试题:ArrayList与LinkedList?
- 第一点:接口实现上:
ArrayList:实现了List接口,而List继承自Collection接口
LinkedList:与ArrayList同样实现了List接口,但是它实现了Deque接口,因此,也就是说:LinkedList支持双端队列的相关逻辑处理。
- 第二点:底层原理实现:
ArrayList:基于数组 LinkedList:基于双端链表队列
- 第三点:数据检索效率:
ArrayList:基于数组,因此在初始化或者加载时就会将元素对应的下标等信息存储在内存中。可以直接下标直接检索获取对应的数据元素。
LinkedList:基于双端链表队列,每个元素都依靠自己在内存中的指针地址,并且他们还要记录与他们相邻的前后元素的指针信息,这种情况下检索信息就需要遍历队列中的元素。查询效率就弱于ArrayList。
但是,LinkedList每次都会存放和记录授为元素的位置,所以如果是获取指定首元素或者尾元素时
LinkedList可直接获取对应的元素信息,此场景时检索效率要优于ArrayList的。(ArrayList需要计算大小,然后遍历获取)
- 第四点:数据修改效率:
ArrayList:基于数组,假设修改非首尾元素,则修改完当前元素时,当前元素以后元素的位置都将发生变化,向后移动。
LinkedList:基于双端链表队列,每个元素只关注与自己相临的元素的信息,因此它的修改要优于ArrayList
- 第五点:扩容机制:
ArrayList:默认初始值为10,每次扩容为当前的1.5倍。(源码如下)
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实现基于双端链表队列,没有初始大小,也没有扩容机制。