在中间位置添加元素,ArrayList比LinkedList效率更高?

nkss 2017-07-21 05:55:56
初始化长度为20万,在下标为10万的位置,分别往两个List插入10万个元素。讲道理,ArrayList需要去移动后10万条加上新添加进来的数据,为什么效率还比LinkedList高。反复试验过,ArrayList耗时在3000多毫秒,LinkedList在18000左右。INDEX值越小(即添加元素的位置越靠前),LinkedList的效率越高,大约INDEX=30000的时候,LinkedList耗时会比ArrayList少。求解
...全文
1120 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
刘俊csdn 2017-10-31
  • 打赏
  • 举报
回复
在初始的集合里面有很多的元素时,linkedList集合插入元素的位置影响linkedList集合插入的效率,插入位置越靠前,效率越高,靠后效率低。linkedList插入元素时需要去查找插入的位置,查找的顺序是从前向后查找的,所以靠后的查找的时间要长。LinkedLIst和ArrayList在插入元素是,插入的位置靠前,linkedList效率高,因为ArrayList在插入是需要移动位置的元素多。插入位置靠后,ArrayList效率高,因为LinkedList需要遍历这个集合的大部分找插入位置,而ArrayList只需要对少数元素进行移位。两个集合在使用add(插入元素)方法时,ArrayList效率绝对要高,因为不需要移位。
nkss 2017-07-24
  • 打赏
  • 举报
回复
引用 4 楼 phantom7493 的回复:
[quote=引用 3 楼 phantom7493 的回复:] 。。。不是越后面性能越差,看源码,它一开始会先将插入点的索引右移1位,也就是除2,判断从前开始找还是从后开始找,所以索引越中间,linkedList性能越差。
[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/6.gif] 。。。口误,是将LinkedList的长度右移位,再和插入点索引比较索引。[/quote] 有道理,我之前一直以为只要不是在末尾插入,LinkedList效率就一定比ArrayList效率高
wautsns 2017-07-22
  • 打赏
  • 举报
回复
引用 3 楼 phantom7493 的回复:
。。。不是越后面性能越差,看源码,它一开始会先将插入点的索引右移1位,也就是除2,判断从前开始找还是从后开始找,所以索引越中间,linkedList性能越差。
[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/6.gif] 。。。口误,是将LinkedList的长度右移位,再和插入点索引比较索引。
wautsns 2017-07-22
  • 打赏
  • 举报
回复
引用 2 楼 u011193276 的回复:
ArrayList:没有遍历行为,底层就一个arraycopy,还是native LinkedList:add前先通过遍历找到对应的元素,当然linkBefore就不耗啥性能了。 关键如你所言,如果插入位置足够靠后,linkedList性能也会足够差
。。。不是越后面性能越差,看源码,它一开始会先将插入点的索引右移1位,也就是除2,判断从前开始找还是从后开始找,所以索引越中间,linkedList性能越差。
乔布什 2017-07-22
  • 打赏
  • 举报
回复

ArrayList:没有遍历行为,底层就一个arraycopy,还是native



LinkedList:add前先通过遍历找到对应的元素,当然linkBefore就不耗啥性能了。

关键如你所言,如果插入位置足够靠后,linkedList性能也会足够差
乔布什 2017-07-22
  • 打赏
  • 举报
回复
引用 4 楼 phantom7493 的回复:
[quote=引用 3 楼 phantom7493 的回复:] 。。。不是越后面性能越差,看源码,它一开始会先将插入点的索引右移1位,也就是除2,判断从前开始找还是从后开始找,所以索引越中间,linkedList性能越差。
[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/monkey/6.gif] 。。。口误,是将LinkedList的长度右移位,再和插入点索引比较索引。[/quote] 嗯嗯,是的,这一点当时注意到了,但不是你说的那种情形,表述不够严谨
MikeDDT009 2017-07-21
  • 打赏
  • 举报
回复
测试一下在原集合的基础上随机位置插入试试

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧