Integer[] elements = new Integer[] { 4, 2, 7, 8, 1, 0, 3, 5, 9, 6 };
List<Integer> arrayList = new ArrayList<>(Arrays.asList(elements));
List<Integer> linkedList = new LinkedList<>(Arrays.asList(elements));
for (int i = 0; i < elements.length; i++) { // Runs for O(n)
Integer l1 = arrayList.get(i); // returns in O(1)
Integer l2 = linkedList.get(i); // returns in O(n)
}
get(index) for ArrayList 直接从内存位置获取index 处的元素。
因此,get(index) 在O(1) 中
get(index) for LinkedList 通过从 LinkedList 的头部位置遍历列表来获取 index 处的元素。对于 LinkedList 的给定索引元素,没有可以预测的指定内存位置。
因此,get(index) 在O(n) 中
ArrayList 的总运行时间 = O(1) * O(n) = O(n)
LinkedList 的总运行时间 = O(n) * O(n) = O(n^2)
使用 java.util.Iterator 类
Iterator iterator = arrayList.iterator();
// total execution time: O(N)
while (iterator.hasNext()) { // runs for each element iteratively
System.out.print(iterator.next());
}
System.out.println();
iterator = linkedList.iterator();
// total execution time: O(N)
while (iterator.hasNext()) { // runs for each element iteratively
System.out.print(iterator.next());
}
System.out.println();
iterator.next() 只是迭代到List 中的下一个元素。这样做的好处是我们不需要从列表的头部搜索List Node。 Iterator class 可帮助您将地址保存到当前node 位置或List。
同样可以使用 for-each 作为迭代器来实现,它具有更简单的代码实现。
for (Integer I : arrayList) { // runs for each element: total execution time: O(N)
System.out.print(I); // gets in O(1)
}
System.out.println();
for (Integer I : linkedList) { // runs for each element: total execution time: O(N)
System.out.print(I); // gets in O(1)
}
因此使用迭代器,
ArrayList 的总运行时间 = O(n)
LinkedList 的总运行时间 = O(n)