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