为什么在LinkedLists中添加特定索引的速度比在ArrayLists中慢

时间:2016-06-07 16:25:54

标签: java performance arraylist linked-list

我正在查看此图表,其中包含列表之间的性能比较:

enter image description here

我觉得很奇怪,在ArrayList中添加和删除特定索引处的元素比在LinkedList中执行得更快。这个图表错了吗? LinkedList的整个想法是改进这样的操作,同时以降低的迭代性能付费。但是这个图表似乎表明Java对LinkedLists的实现做得非常糟糕。

我应该相信图表吗?如果是这样,为什么Java LinkedLists表现如此糟糕?

2 个答案:

答案 0 :(得分:13)

  

LinkedList的整个想法是改进这样的操作,同时以降低的迭代性能付费。

不,链接列表的想法是在结尾处开始添加或删除 非常便宜......或者如果你已经有一个节点对象的引用,那就添加或者删除它也很便宜。 (我不认为Java API会暴露节点,但是像.NET这样的其他平台会这样做。)

要在链接列表中添加索引,实现首先必须导航到该索引处的节点...这是一个O(n)操作。一旦它到达那里,添加便宜。因此,在开始附近添加索引(或以智能实现结束)是便宜的,但在中间附近添加索引是昂贵的。

使用ArrayList,费用来自:

  • 将现有元素复制到您要添加的索引之外
  • 复制整个事情是缓冲区不够大

答案 1 :(得分:2)

一般信息:

制作微观基准受到许多因素的影响,因此定义一个对小数字可靠的微基准并不容易。

插入可视为两个步骤:

  • 找到位置
  • 插入元素

第一步,找到位置,在O(n)中完成,O {1)中的第二步是LinkedList

使用ArrayList查找位置为O(1),而插入则在O(n)中完成。将记录移动一个位置(为新元素创建空间)是使用本机库完成的,因此操作非常快。