关注我,每天三分钟,轻松掌握一个Java知识点。
1.ArrayList和LinkedList有什么区别?
ArrayList:查询快,增加删除慢。
LinkedList:查询慢,增加删除快。
2.是什么造成了两者之间的差别?
如图所示,ArrayList实现了List接口,它本质上上是一个数组,只不过它能通过插入的数据,动态调整自己的大小,我们来看一下它的源码:
我们发现,如果插入数据超出了原有定义的数组长度,ArrayList会建立一个新的数组,是原来数组的1.5倍,然后通过copyOf方法,把原有的数组里的数据搬迁过来,这也是导致ArrayList增删变慢的原因之一。
再一个原因是,ArrayList在内存中是一整条的,这也是它能快速查找的愿意,但如果你删除这整条中间某个元素,为了保证完整性,该元素的所有后续元素,位置都会前移,这个开销还是很大的。
我们再来看看linkedList,它的结构如图:
它的本质是双向链表,何为双向链表呢,就是一个节点上有它的前面一个元素和后面一个元素的位置信息,这样我们如果知道一个节点,那访问它的前后节点都特别方便。
大家可以看到,如果我们想删除一个元素,只需把前一个元素的尾部信息和后一个元素的首部信息修改一下就好了,其他元素并不需要移动。这就是链表插入和删除效率高的原因。
链表不支持快速随机访问,你要想看某一个元素,那你就需要从头遍历链表,所以它的查询速度非常慢。
可能有人要反驳说,LinkedList里面有get(n)方法,说明链表可以访问指定位置的值啊。
其实这个方法本质是看你传入的索引位置和链表size()/2位置比较,如果比较大的话,就从尾部开始检索,优化的地方有限。
综上所述,如果你的列表元素非常少的话,使用ArrayList完全没问题的,特别是想要对集合进行频繁检索的,更应避免使用LinkedList。
3.链表中都有哪些特有的方法
- void addFirst(E element)//将某个元素添加到链表首部
- void addLast(E element)//将某个元素添加到链表尾部
- E getFirst()//获取首元素
- E getLast()//获取尾元素
- E removeFirst()//移除首元素
- E removeLast()//移除尾元素
- LinkedList(Collection extends E> element)//构建一个链表,将集合中所有元素添加到链表中
以上就是今天的知识点,各位小伙伴get到吗?创作不易,望各位多多点赞收藏,有什么建议可以留言告诉我,我会积极采纳!