浅谈ArrayList和LinkedList的区别

ArrayList本质上是一个数组类,通过动态扩容的方式可以实现长度的一个动态变化,优先判断需要的最小长度,如果该长度大于数组目前的长度,那么进行扩容,首次是由0扩容到10,后面每次触发扩容语句扩容到原来的1.5倍,例如15的话扩容1.5倍是四舍五入原则,扩容到22,他用的是将原来长度+原来长度右移一位得到的长度=新数组长度的技术来实现的,你可以去了解一下,效果就是刚刚说的四舍五入扩大到原来的1.5倍那个效果差不多,然后就产生为一个新的长度的数组,并将原来数组的东西拷贝过去。我们使用那个size实际上是一个计数器,看见的并非数组的实际空间长度,计算给里面添加了多少次的东西(删除的话也会减少一)。

LinkedList属于链表,与前者相比它的内存空间并不是连续的,带来的好处是省了内存,提高了增删的速度。其实现原理是在定义某个链表时,给出首个空间的地址,对首个空间赋值后,该空间共有两个元素,一个是本空间的值,另外一个是指向下一空间的地址,但在下一个空间未被生成前,地址那是空的,直到下一个空间被生成出来之后,才会有一个指向下一空间的地址,下一空间地址同上一空间的值保存在上一空间内,由于链表的内存空间不是连续的,所以无法采用角标的方式进行定位,所以查询的速度要慢于ArrayLIst。

两种数据类型各有优点,空间与时间不可兼得往往也是开发过程中的常态,所以我们要根据自己使用场景选择自己需要的数据类型即可。

频繁增删一般来说建议使用链表,查询较多则使用动态数组,具体原因在上文已经有说明,如果有疑问也可以查阅别的更详细的文章。

同时,在笔者平时的力扣刷题练习中,偶尔会采用链表+迭代器遍历的方式,有时也能优势互补,时间和空间都会比直接用动态数组会有改善,不过效果一般不明显。对这个问题感兴趣的同学可以去看看迭代器如何遍历链表,为什么比直接读取要快,具体的实现方式等。

大一新码农,内容如有错误和补充,欢迎评论区留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值