思路
底层数据结构—》适用场景—》相同点和不同点
底层数据结构
他们的底层数据结构不同,ArrayList
底层是基于数组实现的,连续内存存储,LinkedList
底层是基于链表实现的,可以存储在分散的内存中。
使用场景
由于底层数据不同,他们所使用的场景也不同,ArrayList
更适合随机查找,LinkedList
更适合删除和添加,查询、添加删除的时间复杂度也不同。
其他相同点和不同点
ArrayList
和LinkedList
都实现了List接口。
LinkedList
还额外实现了Deque
接口,所以LinkedList
还可以当作双端队列来使用。
详细解释
查看-二者类的结构
LinkedList
实现了Deque
接口,就包含了addFirest
、addLast
等队列的操作
数据模型
数组模型图:
链表模型图:
查询操作
ArrayList.get(1)
根据下标进行查询,因为数组是提前分配好的内存空间,可以直接根据下标查找,速度很快。
LinkedList.get(1)
相对而言,链表根据指定下标进行查询时,需要遍历链表,逐个进行查找,直至所要查询的下标位置
源码中看get操作:会发现,想要获取某个下标的值,需要从第一个开始进行遍历查找。
二者这两个操作进行比较的话,ArrayList
会相较LinkedList
操作会快一些,但是LinkedList
中有getFirst()
和getLast()
操作,这两个操作也是很快的,因为在LinkedList
中通过last和first两个树形记录了两个元素的位置,获取时可以直接拿到,不需要遍历。
新增操作
二者都有两个方法,
ArrayList
add(1) 直接增加一个元素,此时会将元素添加到最后一个元素。
该方法正常添加数据都是很快的,但是存在一种情况是数组可能会需要扩容,如果数据要扩容的情况,添加元素的速率就会有些影响。
add(1,1) 指定元素的位置进行添加。
该方法通过指定元素添加,如果要插入下标的位置不存在元素,则直接进行添加,但是如果要插入元素的位置存在元素,则会存在已有元素的后移操作,相对而言速率不是很高的。
LinkedList
add(1) 直接增加一个元素,此时会将元素添加到最后一位,因为LinkedList
底层采用的是链表结构,链表是不存在扩容操作的,所以相对来说add操作速度会比较快。
add(1,1) 指定元素的位置进行添加。
这个操作,效率取决于要插入元素的位置,如果要插入元素的位置比较大的时候,链表就需要逐个遍历之前的元素,此时效率也会有些影响的。
对比二者的add(1,1)方法,ArrayList
不需要查找待插入的位置,需要插入元素后移动后续的元素,LinkedList
操作需要先遍历找到要插入的位置,而后插入元素。二者插入的性能来说是无法直接进行比较的,这个和具体数据存在关联。
总结
如果查询比较多的情况可以使用ArrayList
频繁进行插入数据的操作可以使用LinkedList
,同时LinkedList
可是当作一个双端队列进行使用。
...
...
Copyright 2021 sunfy.top ALL Rights Reserved