我正在查看此图表,其中包含列表之间的性能比较:
我觉得很奇怪,在ArrayList
中添加和删除特定索引处的元素比在LinkedList
中执行得更快。这个图表错了吗? LinkedList
的整个想法是改进这样的操作,同时以降低的迭代性能付费。但是这个图表似乎表明Java对LinkedLists
的实现做得非常糟糕。
我应该相信图表吗?如果是这样,为什么Java LinkedLists
表现如此糟糕?
答案 0 :(得分:13)
LinkedList的整个想法是改进这样的操作,同时以降低的迭代性能付费。
不,链接列表的想法是在结尾处开始添加或删除 非常便宜......或者如果你已经有一个节点对象的引用,那就添加或者删除它也很便宜。 (我不认为Java API会暴露节点,但是像.NET这样的其他平台会这样做。)
要在链接列表中添加索引,实现首先必须导航到该索引处的节点...这是一个O(n)操作。一旦它到达那里,添加便宜。因此,在开始附近添加索引(或以智能实现结束)是便宜的,但在中间附近添加索引是昂贵的。
使用ArrayList
,费用来自:
答案 1 :(得分:2)
一般信息:
制作微观基准受到许多因素的影响,因此定义一个对小数字可靠的微基准并不容易。
插入可视为两个步骤:
第一步,找到位置,在O(n)中完成,O {1)中的第二步是LinkedList
。
使用ArrayList
查找位置为O(1),而插入则在O(n)中完成。将记录移动一个位置(为新元素创建空间)是使用本机库完成的,因此操作非常快。