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方法来写入对象。