ArrayList 和 LinkedList 的区别-详细版

56 篇文章 5 订阅

ArrayList 和 LinkedList 的区别是什么?

相同点:都是List接口下的实现类,都是单列集合;都是线程不安全的。

不同点

  1. 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表(凡是出现linked都是基于双向链表的)的数据结构实现。数组大小固定,不能动态拓展。 内存空间要求高,必须有足够的连续内存空间。数组可能浪费内存空间,容量存满的时候再添加元素需要扩充,没存满又造成部分内存空间的浪费;而链表不存在长度固定,也不需要扩容,内存空间利用率高,但是每个元素都有前驱节点和后驱节点的空间消耗

  2. 随机访问效率:对于随机访问的get(index)和set(index),ArrayList要优于LinkedList,因为LinkedList要移动指针.而数组可以直接通过数组名【index】获取或者设置元素

  3. 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 中间和头部增删,会涉及数组元素位置的移动,效率比较低

  4. 内存空间占用:LinkedList 比 ArrayList 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素,数据量大的话会占用不少内存空间

综合来说,在需要频繁读取集合中的元素时,更推荐使用 ArrayList,而在插入和删除操作较多时,更推荐使用 LinkedList。

在这里插入图片描述

扩展:ArrayList和LinkedList哪个更占空间:

ArrayList:ArrayList中数组被transient来修饰:
不想序列化的对象就可以用transient来修饰,用transient修饰elementData意味着我不希望elementData数组被序列化。

总结回答:

一般情况下,LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化

其他详细用法内容参考:

https://zhuanlan.zhihu.com/p/303051913

扩展:ArrayList底层操作机制:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值