根据下面的程序,ArrayList中的插入和删除比LinkedList要快。请给我证明在LinkedList中插入和删除应该比在ArrayList中更快。
public static void main(String args[]) {
ArrayList al = new ArrayList();
LinkedList ll = new LinkedList();
int max_value = 10000000;
// --------------------------------ArrayList-----------------------------------
for (int i = 0; i <= max_value; i++) {
ll.add(Integer.valueOf(i));
al.add(Integer.valueOf(i));
}
int middle = max_value / 2;
long d1 = System.currentTimeMillis();
al.add(middle,Integer.valueOf(5));
al.add(middle,Integer.valueOf(5));
al.remove(middle);
al.add(middle,Integer.valueOf(5));
al.remove(middle);
al.add(middle,Integer.valueOf(5));
al.remove(middle);
al.add(middle,Integer.valueOf(5));
al.remove(middle);
al.add(middle,Integer.valueOf(5));
long d2 = System.currentTimeMillis();
System.out.println("Time Taken in ArrayList: " + (d2 - d1));
// --------------------------------LinkedList-----------------------------------
long d3 = System.currentTimeMillis();
ll.add(middle,Integer.valueOf(5));
ll.add(middle,Integer.valueOf(5));
ll.remove(middle);
ll.add(middle,Integer.valueOf(5));
ll.remove(middle);
ll.add(middle,Integer.valueOf(5));
ll.remove(middle);
ll.add(middle,Integer.valueOf(5));
ll.remove(middle);
ll.add(middle,Integer.valueOf(5));
long d4 = System.currentTimeMillis();
System.out.println("Time Taken in LinkedList: " + (d4 - d3));
}
输出:
Time Taken in ArrayList: 38在LinkedList中花费的时间:537
你这里有一个单一的情况。在本例中,您是在索引处添加和删除。链表实现不知道哪个元素在那个位置,所以它每次都要计数。此操作将较慢。
如果你有一个迭代器指向链表中的一个元素,那么在这个点上插入和删除会变得非常快,因为不需要复制数组或扩大容器数组。这就是为什么链表更快的一般情况。
这种行为的一个例子是当你迭代列表并需要基于某些条件删除项时。然后,每次需要删除一个项时,一个链表就会将前一个项设置为指向被删除元素之后的元素,并销毁被删除的元素。这是常数时间操作。对于数组(列表),这需要将数组的其余部分向后复制一项,这是一个非常慢的操作,并且取决于数组(列表)的位置和大小。
所以链表并不总是更快或更好,这就是为什么我们仍然使用常规的数组和列表。它们在随机访问时速度很慢,但如果使用得当,速度会更快。