小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
主要区别:
- 首先他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的。
- 由于底层的数据结构不同,造成了他们所适用的场景也不同,ArrayList更适合随机查找,而LinkedList更适合删除和添加,同时查询、添加、删除的时间复杂度也不同。
- 另外ArrayList和LinkedList都实现了List接口,但是LinkedList还实现了Deque接口,所以LinkedList还可以当作队列来使用。
查询:
ArrayList由于底层是数组,那么在获取其中某个元素的时候能直接获取。
LinkedList底层是由链表实现的,那么在获取LinkedList中非首尾元素时速度要更慢,需要通过遍历才行,在LinkedList源码中也是这样实现。
get方法中具体实现: get方法中具体实现: 同时又因为LinkedList底层为链表的原因,通过getFirst()方法获取第一个元素和getLast()方法获取最后一个元素时速度还是很快的。
- 添加:
ArrayList在数组最后添加一个元素操作时直接把元素添加到最后的位置上同时进行扩容,在中间某个下标添加元素时,由于该下标已经由元素了就需要给添加的元素腾出一个位置,所以后面的元素就需要整体往后移,然后再把添加的元素插入到该下标中。
LinkedList在最后添加一个元素操作时直接在链表最后添加一个元素,不涉及到扩容。在中间添加元素时需要先遍历链表找到这个下标,然后再插入过程中不涉及元素的移动操作,这里的快慢取决于下标的大小。
两者添加的性能没法进行比较需要看具体的使用场景。
- 删除
ArrayList删除就和插入刚好相反,删除其中某个下标的元素删除后该下标之后的元素整体往前移,LinkedList 删除操作时先遍历找出该下标再进行删除。