工作中,大家是不是经常分不清楚,什么时候用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接口。

这个问题也是阿里面试的真题,希望大家有所收获,下面给大家分享大厂面试真题。欢迎扫下方名片来领取

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐