在说到面试题之前,我们先得简单说一下这两种集合有什么特点
1 ArrayList的特点
ArrayList:基于数组实现
具有查询快增删慢等特点
其中它的运行逻辑如下图所示,很重要,待会要用。当数组需要扩容时,因为无法直接添加数据,实际上是创建一个新的数组,把原数组内的数据全部复制去新数组里面。
2 LinkedList的特点
LinkedLis1t是基于链表结构实现的。链表由一个一个的节点组成,将数据首尾相连,这就造成了特点:查询慢增删快(正好跟ArrayList反过来)
当我们需要增删数据时,只需要拆开链表的两端,把数据塞进去,再连回来即可,很方便快捷。
单向链表就是首尾相连,双向链表就是反过来再连一遍,这就导致了效率是单向链表的两倍!
虽然依然很慢
3 面试题
我们先拟定一种情况,有很大的数据需要添加,且我们可以在队尾添加,此时是查询快增删慢的ArrayList更快还是查询慢增删快的LinkedList更快呢?
首先我们先想想ArrayList的特点,它在扩容时会增加1.5倍的容量。这时候,当我们添加很大量的数据时,它也会扩容很大的容量,此时我们从队尾添加数据的时候,它不需要再进行耗时耗力的扩容。所以是ArrayList更快!
第二种情况,有很大的数据需要添加,且我们只能在队首添加。
此时,ArrayList虽然扩容了很大的容量,但因为是在队首添加,所以每添加一次就要把所有数据都往后挪一位,自然需要大量的操作。所以这时候时LinkedList更快!