你也许也想知道的ArrayList和LinkedList

ArrayList和LinkedList的区别

就这?看看名字都知道,arraylist基于数组,linkedlist基于链表
你问我他们的不同,数组的结构在查询时是通过索引,链表只能遍历。所以查询时arraylist更好。但在增删的时候,arraylist是一个变长的结构,所以要反复扩容改变长度,linkedlist只需要根据指针插入,所以增删时linkedlist更好。

原理?就等你问了
那我们讲一个增的例子呗。下面是ArrayList您请看
在这里插入图片描述
elementData是一个Object数组
在这里插入图片描述
size是代表逻辑长度,就是说实际有几个元素在里面。
在这里插入图片描述
不难看出先调用了一个ensureCapacityInternal方法,它是用来判断数组是否为空的。那么这个方法是什么呢
在这里插入图片描述
其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个数组,DEFAULT_CAPACITY是定义好的默认容量。
在这里插入图片描述
在这里插入图片描述
(这里顺便说一下,关于ArrayList默认容量的问题,我看过的解释众说纷纭,反正我就知道是10)
里面又用了一个ensureExplicitCapacity方法来确定大小,那么在看看这个方法
在这里插入图片描述
最后调用grow来扩容
在这里插入图片描述
这里面有一个MAX_ARRAY_SIZE最大长度,那么是怎么定义的呢
在这里插入图片描述
这里涉及的就是Integer最大长度的话题了,这里不做详谈。
所以这一次add操作绕了一圈扩容的机制才能完成。

那么LinkedList呢,各位您上眼
在这里插入图片描述
在这里插入图片描述
设置好指针就行了啊,就这?

Okok在增删这一块确实LinkedList拿捏了,那看看查询arraylist如何翻盘
在这里插入图片描述
判断一下是否在界限内
在这里插入图片描述
在这里插入图片描述
你要是整个index索引咱还说啥,那你说说LinkedList咋就不行了
在这里插入图片描述
诶诶诶你这不还是index还说啥了,他凭什么慢?且看我点开node这个方法
在这里插入图片描述
大意了吧,其实本质就是用index判断正反遍历而已

最后附赠一个删除操作(相当恶心)
ArrayList
因为有索引所以删除要一个index(当然也有一种传参是objcect的)
在这里插入图片描述
画个图理解一下
在这里插入图片描述
如果numMoved大于0我们就要把后面的部分拼回去
在这里插入图片描述
最后交给gc去回收

LinkedList
在这里插入图片描述

只用了一个unlink
在这里插入图片描述
就是把前后的元素指针先改了,最后把它给删了,size–。

最后再说两件事,modCount如果你还不认识,简单来说是一个计数器,一般存在于线程不安全的集合容器中,主要为了实现操作过程中的快速失败。(出了问题中间直接对比一下这个计数器就结束啦)对于这个计数器可以自己查查相关内容,常见于迭代器中。还有关于序列化和transient关键字,这个关键字可以理解为阻止了序列化,序列化的内容不在这里讲,ArrayList有writeObject方法来写入对象。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值