这个问题在这里已经有答案了:
为什么链表末尾的插入比数组列表[重复]慢(2个答案)
6年前关门了。
看完这个[问题]:什么时候使用linkedlist而不是arraylist?我试图对arraylist和linkedlist的性能进行基准测试。但我发现的结果与答案大相径庭。就add()而言,arraylist的性能是linkedlist的2-3倍。据我所知,linkedlist.add(e element)是o(1)<---linkedlist arraylist.add(e element)的主要优点是o(n-index),但结果表明array list比linkedlist快得多
有人能解释一下这种行为吗
public static void main(String[] args) {
long start = System.currentTimeMillis();
List<Integer> b = new LinkedList<Integer>();
for (int i = 0; i < 1000000; i++) {
b.add(i);
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
List<Integer> a = new ArrayList<Integer>();
for (int i = 0; i < 1000000; i++) {
a.add(i);
}
System.out.println(System.currentTimeMillis() - start);
}
2条答案
按热度按时间d5vmydt91#
你很困惑。在列表末尾添加一个元素是o(1),这两个列表都是。
arraylist的唯一例外情况是当列表的容量已达到时,这将强制arraylist示例化一个新数组,并将所有元素从旧数组复制到新数组。但这种情况很少发生,因为每次完成后,容量都会乘以1.5。
在这两种情况下,在列表中间添加一个元素都是o(n)。linkedlist必须迭代(从开始到结束),直到找到必须插入新节点的位置。arraylist必须将插入索引中的所有元素移到末尾。
a0x5cqrl2#
你只是在测试
append
列表的属性。ArrayList
以及LinkedList
是清单的具体实施。在一天结束时,您的基准目标是确定哪种列表更适合哪种情况。这就是为什么一个有效的基准会尝试根据列表接口提供的所有新操作和规定来测试这两个实现。