工作中,大家是不是经常分不清楚,什么时候用ArrayList,什么时候用LinkedList?
所以我们应该弄清楚ArrayList和LinkedList之间的区别,然后才知道工作中该如何选型。
一、ArrayList和LinkedList查询之间的区别
首先,从名字就可以看出,ArrayList和LinkedList的区别,ArrayList是基于数组的,LinkedList是基于链表的。
从这一点,我们可以推理出来,ArrayList适合查询,LinkedList适合插入,但是这只是一个广泛的结论,我们应该了解的更细致一点。
比如,对于ArrayList,它真正的优点是按下标查询元素,相比于LinkedList,LinkedList也可以按下标查询元素,但是LinkedList需要对底层链表进行遍历,才能找到指定下标的元素,而ArrayList不用,所以这是ArrayList的优点。
但是,如果我们讨论的是获取第一个元素,或最后一个元素,ArrayList和LinkedList在性能上是没有区别的,因为LinkedList中有两个属性分别记录了当前链表中的头结点和尾结点,并不需要遍历链表。
以上,是对于ArrayList和LinkedList在查询方面的区别。
二、ArrayList和LinkedList插入之间的区别
我们再来研究一下在插入方面的区别:
ArrayList可以插入到指定下标位置,或者数组末尾,这种插入普通情况下是很快的,但是如果某次插入操作触发了扩容,那么本次插入就增加了额外的扩容成本。
对于LinkedList,如果是插在链表的头部或者是尾部都是很快的,因为LinkedList中有单独的属性记录的链表的头结点和尾结点,不过,如果是插在指定下标位置,那么就需要遍历链表找到指定位置,从而降低了效率。
但是,使用LinkedList是不用担心扩容问题的,链表是不需要扩容的。
综上:
1.默认情况下,比如调用ArrayList和LinkedList的add(e)方法,都是插入在最后,如果这种操作比较多,那么就用LinkedList,因为不涉及到扩容。
2.如果调用ArrayList和LinkedList的add(index, e)方法比较多,就要具体考虑了,因为ArrayList可能会扩容,LinkedList需要遍历链表,这两种到底哪种更快,是没有结论的,得具体情况具体分析。
3.还有,如果是插入场景比较少,但经常需要查询的话,查询分两种,第一种就是普通遍历,也就是经常需要对List中的元素进行遍历,那么这两种是区别不大的,遍历链表和遍历数组的区别,第二种就是经常需要按指定下标获取List中的元素,如果这种情况如果比较多,那么就用ArrayList
以上,是对ArrayList和LinkedList在查询和插入之间的分析和对比。
大家如果还有其他对比思路或想法,可留言进行讨论。
另外,LinkedList还有一个特殊功能,LinkedList可以当做双端队列使用,这个是ArrayList不具备的。
这一点从源码也是看得出来的,ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现了Deque接口。
这个问题也是阿里面试的真题,希望大家有所收获,下面给大家分享大厂面试真题。欢迎扫下方名片来领取