Java面试题001-ArrayList和LinkedList区别

底层数据结构--》适用场景--》相同点和不同点

Posted by Sunfy on 2021-07-13
Words 867 and Reading Time 3 Minutes
Viewed Times
Viewed Times
Visitors In Total

思路

底层数据结构—》适用场景—》相同点和不同点

底层数据结构

他们的底层数据结构不同,ArrayList底层是基于数组实现的,连续内存存储,LinkedList底层是基于链表实现的,可以存储在分散的内存中。

使用场景

由于底层数据不同,他们所使用的场景也不同,ArrayList更适合随机查找,LinkedList更适合删除和添加,查询、添加删除的时间复杂度也不同。

其他相同点和不同点

ArrayListLinkedList都实现了List接口。

LinkedList还额外实现了Deque接口,所以LinkedList还可以当作双端队列来使用。

详细解释

查看-二者类的结构

image-20210712112423871

image-20210712112411812

LinkedList实现了Deque接口,就包含了addFirestaddLast等队列的操作

image-20210712112723040

数据模型

数组模型图:

img

链表模型图:

image-20210712113418978

查询操作

ArrayList.get(1) 根据下标进行查询,因为数组是提前分配好的内存空间,可以直接根据下标查找,速度很快。

LinkedList.get(1) 相对而言,链表根据指定下标进行查询时,需要遍历链表,逐个进行查找,直至所要查询的下标位置

源码中看get操作:会发现,想要获取某个下标的值,需要从第一个开始进行遍历查找。

image-20210712113650183

二者这两个操作进行比较的话,ArrayList会相较LinkedList操作会快一些,但是LinkedList中有getFirst()getLast()操作,这两个操作也是很快的,因为在LinkedList中通过last和first两个树形记录了两个元素的位置,获取时可以直接拿到,不需要遍历。

新增操作

二者都有两个方法,

ArrayList

add(1) 直接增加一个元素,此时会将元素添加到最后一个元素。

该方法正常添加数据都是很快的,但是存在一种情况是数组可能会需要扩容,如果数据要扩容的情况,添加元素的速率就会有些影响。

image-20210712115244051

add(1,1) 指定元素的位置进行添加。

该方法通过指定元素添加,如果要插入下标的位置不存在元素,则直接进行添加,但是如果要插入元素的位置存在元素,则会存在已有元素的后移操作,相对而言速率不是很高的。

image-20210712115716970

image-20210712120040213

LinkedList

add(1) 直接增加一个元素,此时会将元素添加到最后一位,因为LinkedList底层采用的是链表结构,链表是不存在扩容操作的,所以相对来说add操作速度会比较快。

add(1,1) 指定元素的位置进行添加。

这个操作,效率取决于要插入元素的位置,如果要插入元素的位置比较大的时候,链表就需要逐个遍历之前的元素,此时效率也会有些影响的。

对比二者的add(1,1)方法,ArrayList不需要查找待插入的位置,需要插入元素后移动后续的元素,LinkedList操作需要先遍历找到要插入的位置,而后插入元素。二者插入的性能来说是无法直接进行比较的,这个和具体数据存在关联。

总结

如果查询比较多的情况可以使用ArrayList

频繁进行插入数据的操作可以使用LinkedList,同时LinkedList可是当作一个双端队列进行使用。


Copyright 2021 sunfy.top ALL Rights Reserved

...

...

00:00
00:00