ArrayList vs. LinkedList:谁是 Java 集合之王?
2022-11-25 16:06:18
Java 中 ArrayList 与 LinkedList:性能比较
在 Java 中,ArrayList 和 LinkedList 都是常用的集合类。虽然它们都用于存储和管理元素,但它们在实现方式和性能表现上存在差异。
ArrayList:基于数组
ArrayList 是基于数组实现的。它使用一个数组来存储元素,就像一个装有物品的箱子。当向 ArrayList 中添加元素时,它会在数组末尾创建一个新的元素,并将元素放入该位置。当从 ArrayList 中删除元素时,它会将要删除的元素从数组中移除,并向前移动数组中后面的元素以填补空位。
LinkedList:基于链表
LinkedList 是基于链表实现的。链表由一组节点组成,每个节点包含指向下一个节点的引用和一个存储元素的字段。当向 LinkedList 中添加元素时,它会创建一个新的节点,并将新节点添加到链表末尾。当从 LinkedList 中删除元素时,它会将要删除的节点从链表中移除,并调整前后节点之间的引用。
性能对比
添加元素
在添加元素方面,ArrayList 的性能明显优于 LinkedList。这是因为 ArrayList 在数组末尾添加元素只需要将元素复制到数组中即可,而 LinkedList 在链表末尾添加元素需要创建新节点,并调整节点间的引用,这需要更多的内存分配和操作。
删除元素
在删除元素方面,LinkedList 的性能优于 ArrayList。这是因为 LinkedList 只需将要删除的节点从链表中移除即可,而 ArrayList 需要将要删除的元素后面的所有元素向前移动以填补空位,这需要更多的内存复制操作。
随机访问元素
在随机访问元素方面,ArrayList 的性能也优于 LinkedList。这是因为 ArrayList 可以直接通过数组下标访问元素,而 LinkedList 需要遍历链表才能访问元素,这使得 ArrayList 的随机访问速度更快。
示例代码:
// ArrayList 示例
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
}
// LinkedList 示例
LinkedList<Integer> linkedList = new LinkedList<>();
for (int i = 0; i < 100000; i++) {
linkedList.add(i);
}
// 测量添加元素时间
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
arrayList.add(i);
}
long endTime = System.currentTimeMillis();
long addArrayListTime = endTime - startTime;
// 测量删除元素时间
startTime = System.currentTimeMillis();
for (int i = 99999; i >= 0; i--) {
arrayList.remove(i);
}
endTime = System.currentTimeMillis();
long removeArrayListTime = endTime - startTime;
// 测量随机访问元素时间
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
arrayList.get(i);
}
endTime = System.currentTimeMillis();
long accessArrayListTime = endTime - startTime;
// 输出测量结果
System.out.println("Add ArrayList Time: " + addArrayListTime);
System.out.println("Remove ArrayList Time: " + removeArrayListTime);
System.out.println("Access ArrayList Time: " + accessArrayListTime);
// 测量添加元素时间
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
linkedList.add(i);
}
endTime = System.currentTimeMillis();
long addLinkedListTime = endTime - startTime;
// 测量删除元素时间
startTime = System.currentTimeMillis();
for (int i = 99999; i >= 0; i--) {
linkedList.remove(i);
}
endTime = System.currentTimeMillis();
long removeLinkedListTime = endTime - startTime;
// 测量随机访问元素时间
startTime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
linkedList.get(i);
}
endTime = System.currentTimeMillis();
long accessLinkedListTime = endTime - startTime;
// 输出测量结果
System.out.println("Add LinkedList Time: " + addLinkedListTime);
System.out.println("Remove LinkedList Time: " + removeLinkedListTime);
System.out.println("Access LinkedList Time: " + accessLinkedListTime);
结论
在选择 ArrayList 和 LinkedList 时,需要根据具体需求进行权衡。如果经常需要添加元素,ArrayList 是更好的选择。如果经常需要删除元素,LinkedList 是更好的选择。如果需要快速随机访问元素,ArrayList 也是更好的选择。
常见问题解答
-
ArrayList 和 LinkedList 之间的主要区别是什么?
- ArrayList 基于数组实现,而 LinkedList 基于链表实现。
-
在哪些情况下应该使用 ArrayList?
- 当需要快速添加元素或随机访问元素时。
-
在哪些情况下应该使用 LinkedList?
- 当需要快速删除元素时。
-
ArrayList 和 LinkedList 的性能差异是否显着?
- 在大多数情况下,是的。ArrayList 在添加元素方面性能优异,而 LinkedList 在删除元素方面性能优异。
-
哪种集合类更适合存储大型数据集?
- 如果需要快速添加和删除元素,LinkedList 可能更适合,因为它的内存效率更高。如果需要快速随机访问元素,ArrayList 可能更适合,因为它的访问速度更快。