首先,我们都知道,linkedList数据结构是链表(也就是每个存储数据的空间会存储上个存储数据空间的地址值,该数据空间存储值和下个存储数据空间的地址值)且是双向链表;
(图略微潦草,将就着看)
而ArrayList的数据存储结构则是数组,而数组的缺点之一就是创建长度即是固定不可变的(类似于String,一旦赋值字符串在进行拼接就会重新字符串常量池创建新的字符串,原字符串还是存在的),
在看了源码的情况下得知,ArrayList的数组初始长度为10
就要说说这两个集合是怎么进行操作数据的:
增加:
linkedList
在linkedList因为其一个数据存储空间分成了三块,分别存储前节点地址值、存储数据和后节点地址值(如果是头节点,上个节点地址值则为null,尾结点类似),所以当插入一条数据时,需将之前的尾结点的下一地址值(或修改其插入的前节点的存储空间的下个节点地址值和后节点存储空间的上个节点地址值金信修改)为当前数据空间的地址值,且将当且数据空间的上个节点地址值变为前节点地址值,数据空间的下个地址值设为null
ArrayList
底层是10长度的数组嘛,如果在未触发扩容机制(未到达原数组最大存储数据长度)前直接就往对应索引对应的存储空间存储,但是达到的数据长度,它底层就会进行创建新数组,新数组容量为原数组容量的1.5倍
故此,比较两种集合增加的效率结果就清晰了。
我们先上代码
现在看下,1000条数据,ArrayList略胜一筹
再来看,10w条数据,链表效率就高出一截啦
经过多次测试,在1w3条数据左右,这两个集合在增加数据的效率就不相上下了,由此可得,增加的效率不一定肯定linkedList快,而是要看数据的量级
再来分析删除的效率比较
linkedList
前面有提到linkedList的数据结构,增加和删除的操作基本一致,删除就是吧要删除的节点的地址位置在前节点的存储下个存储数据空间的地址值,改为被删除节点的后节点地址值,(后节点的操作同)
然后我们再来看看源码会更清晰
(先是判null值,如果要删除的值为null,原链表该是啥就还是啥,头节点还是头节点,尾结点就还是尾结点)
ArrayList
而相对于链表,ArrayList的删除就比较复杂了,它会获得该值对应的下标(类似数组的索引),然后获得其下标之后的对应剩余的集合长度进行数组拷贝,从要删除的下标开始,剩余的最后一个下标赋值null交给gc清理
(同样先进行null判断)
由此ArrayList删除数据的步骤显然要比linkedList要多,我们来看看测试用例
(linkedList)
(ArrayList)
很明显,即使只删除集合中十分之一的数据,linkedList都比ArrayList的效率要高的多
结论就是,linkedList和ArrayList的增加在万级数据量才会比后者要快,而删除因为ArrayList对于删除数据的操作步骤要与之多的多,且跟为耗时,所以存储同样数量数据的linkedList会比ArrayList要更快。
(有兴趣的朋友也可以去写写这个demo,评论里互相讨论哦)



