ArrayList和LinkedList是Java集合框架中两种不同的数据结构。 ArrayList是一个动态数组,它可以自动调整大小以容纳添加或删除的元素。它通过索引访问元素,因此在获取元素时具有较快的速度。然而,在插入或删除元素时,需要移动其他元素来保持连续性,这可能会导致较慢的性能。 LinkedList是一个双向链表,它由节点组成,每个节点都包含一个元素和指向前一个和后一个节点的引用。在插入或删除元素时,只需更改节点之间的引用,不需要移动其他元素,因此具有较快的插入和删除速度。然而,在获取元素时,需要遍历链表直到找到所需元素,因此速度较慢。 因此,当需要频繁地插入或删除元素时,LinkedList是更好的选择。而当需要频繁地访问元素时,ArrayList更加适合。

13 浏览
0 Comments

ArrayList和LinkedList是Java集合框架中两种不同的数据结构。 ArrayList是一个动态数组,它可以自动调整大小以容纳添加或删除的元素。它通过索引访问元素,因此在获取元素时具有较快的速度。然而,在插入或删除元素时,需要移动其他元素来保持连续性,这可能会导致较慢的性能。 LinkedList是一个双向链表,它由节点组成,每个节点都包含一个元素和指向前一个和后一个节点的引用。在插入或删除元素时,只需更改节点之间的引用,不需要移动其他元素,因此具有较快的插入和删除速度。然而,在获取元素时,需要遍历链表直到找到所需元素,因此速度较慢。 因此,当需要频繁地插入或删除元素时,LinkedList是更好的选择。而当需要频繁地访问元素时,ArrayList更加适合。

我正在关注一个关于这个问题的之前的帖子,它说:

对于LinkedList:

- get操作的时间复杂度是O(n)

- add操作的时间复杂度是O(1)

- remove操作的时间复杂度是O(n)

- Iterator.remove操作的时间复杂度是O(1)

对于ArrayList:

- get操作的时间复杂度是O(1)

- add操作的时间复杂度是平摊O(1),但是最坏情况下是O(n),因为数组必须进行调整大小和复制

- remove操作的时间复杂度是O(n)

所以根据这个,我得出结论,如果我只需要对我的集合进行顺序插入,比如5000000个元素,LinkedList会比ArrayList更好。

而且,如果我只需要通过迭代来获取集合中的元素,而不是获取中间的元素,LinkedList仍然会比ArrayList更好。

现在为了验证我上面的两个说法,我写了下面的示例程序... 但是我惊讶地发现我的上述说法被证明是错误的。

ArrayList在两种情况下都比LinkedList更好。它花费的时间比LinkedList更少,无论是添加还是从集合中获取元素。我做错了什么吗,还是LinkedList和ArrayList的初始说法在5000000个元素的集合中不成立?

我提到了集合的大小,因为如果我将元素数量减少到50000,LinkedList表现得更好,初始的说法成立。

long nano1 = System.nanoTime();
List arr = new ArrayList();
for (int i = 0; i < 5000000; i++) {
    arr.add(i);
}
System.out.println(System.nanoTime() - nano1);
for (int j : arr) {
    // 什么也不做
}
System.out.println(System.nanoTime() - nano1);
long nano2 = System.nanoTime();
List arrL = new LinkedList();
for (int i = 0; i < 5000000; i++) {
    arrL.add(i);
}
System.out.println(System.nanoTime() - nano2);
for (int j : arrL) {
    // 什么也不做
}
System.out.println(System.nanoTime() - nano2);

0