LinkedList真的比ArrayList增删快吗?为什么?
首先,我们都知道,LinkedList数据结构是链表且是双向链表(每个节点会存储上个节点的地址、存储数据和下个节点的地址);
(图略微潦草,将就着看)
而ArrayList的数据存储结构则是数组,数组的优点就是有索引的同时其存储数据的内存空间是连续的,就使得可以通过数学表达式计算出所需查下标的内存地址,不会像链表当检索某个数据时要从头节点一直往下查;而数组的缺点之一就是创建长度即是固定不可变的(类似于String,一旦赋值字符串在进行拼接就会重新字符串常量池创建新的字符串,原字符串还是存在的),
在看了源码的情况下得知,ArrayList的数组初始长度为10
然后就要说说这两个集合是怎么进行操作数据的:
首先增加:
LinkedList
在LinkedList因为每个Node节点都有三个属性,分别存储前节点地址值、存储数据和后节点地址值(如果是头节点,上个节点地址值则为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,评论里互相讨论哦)
LinkedList真的比ArrayList增删快吗?为什么?相关推荐
- java linkedlist 查找_Java中LinkedList真的是查找慢增删快
测试结果 废话不多说,先上测试结果.作者分别在ArrayList和LinkedList的头部.尾部和中间三个位置插入与查找100000个元素所消耗的时间来进行对比测试,下面是测试结果 (感谢@Hosa ...
- LinkedList 真的是查找慢增删快?
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源:juejin.im/post/5c00987de5 ...
- 你真的懂ArrayList吗?说说foreach与iterator时remove的区别
文章目录 1. ArrayList 和 LinkedList的区别 1.1 CopyOnWriteArrayList怎么保证线程安全? 1.2 Vector.ArrayList.LinkedList的 ...
- LinkedList一定比ArrayList的插入和删除效率高吗
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 本文主要看一下,两种List集合,插入删除效率情况,为什么使用ArrayList的情况更多些? Linked ...
- LinkedList为什么增删快、查询慢
List家族中共两个常用的对象ArrayList和LinkedList,具有以下基本特征. ArrayList:长于随机访问元素,中间插入和移除元素比较慢,在插入时,必须创建空间并将它的所有引用向前移 ...
- java中的LinkedList(链表)与ArrayList(动态数组):(1)简单辨析
一.数组的缺点(为什么需要引入JAVA集合): 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合. 首先数组可以存放基本数据类型和对象, ...
- 自动驾驶真的会来得那么快吗:关于自动驾驶的7个疑问
来源:资本实验室 自动驾驶汽车的研发已经成为全球热潮.无论是像谷歌.百度.Uber这样的互联网巨头,还是丰田.通用.福特这样的老牌汽车制造商,都在以大量的人力.资金向自动驾驶领域下注. 然而,无论是W ...
- 美团安卓面试,难道Android真的凉了?快来收藏!
我所接触的Android开发者,百分之九十五以上 都遇到了以下几点致命弱点! 如果这些问题也是阻止你升职加薪,跳槽大厂的阻碍. 那么我确信可以帮你突破瓶颈! 1.开发者的门越来越高: 小厂的机会少了, ...
- java中的LinkedList(链表)与ArrayList(动态数组):(2)尝试简单实现LinkedList
一.对于LinkedList需要方法的简单分析 从简图中可以看出,要完成对链表的简单实现,首先应先具有一个用于创造节点对象的Node类,在Node类中应至少具有两个属性: (1).用于保存本节点数据的 ...
最新文章
- tcpdump抓包并保存到远程服务器
- linux下的daemon进程
- Python工具包werkzeug
- html5_0_文章_分级_分段
- Linux下c的进一步学习
- skysat重访周期_重访小恶梦
- Kafka—配置SASL/PLAIN认证客户端及常用操作命令
- freemarker空值处理
- 使用反射修改final属性
- BZOJ3172 TJOI2013 单词 AC自动机
- #include <iostream> C++ Hello World!
- C语言中期报告格式,本科论文中期报告范文_本科毕业论文中期报告模板(2)
- android ListView的怪异现象
- 3G UMTS与4G LTE核心网(一):移动核心网基础
- 【源码分析】Spring Boot中Relaxed Binding机制的不同实现
- java游戏猿人时代_猿人时代BT版_JAVA游戏免费版下载_7723手机游戏[www.7723.cn]
- matlab连接mysql有什么用_MATLAB连接SQLServer和MySql数据库
- Predicting microbial interactions through computational approaches
- 女生突然不回微信,那你首先得明白不回微信的原因
- c语言函数指针的理解与使用