# Java 中`ArrayList`和`LinkedList`的区别

> 原文： [https://beginnersbook.com/2013/12/difference-between-arraylist-and-linkedlist-in-java/](https://beginnersbook.com/2013/12/difference-between-arraylist-and-linkedlist-in-java/)

[`ArrayList`](https://beginnersbook.com/2013/12/java-arraylist/)和[`LinkedList`](https://beginnersbook.com/2013/12/linkedlist-in-java-with-example/)都实现了`List`接口，它们的方法和结果几乎相同。然而，它们之间几乎没有差异，这取决于要求，使一个优于另一个。

## `ArrayList`与`LinkedList`

1）**搜索**：与`LinkedList`搜索操作相比，`ArrayList`搜索操作非常快。`ArrayList`中的`get(int index)`给出`O(1)`的性能，而`LinkedList`性能为`O(n)`。

原因：`ArrayList`维护其元素的基于索引的系统，因为它隐式使用数组数据结构，这使得搜索列表中的元素更快。另一方面，`LinkedList`实现了**双向链表**，它需要遍历所有元素来搜索元素。

2）**删除**：`LinkedList`删除操作给出`O(1)`性能，而`ArrayList`提供可变性能：在最坏的情况下`O(n)`（删除第一个元素）和在最好的情况下`O(1)`（删除最后一个元素）。

结论：与`ArrayList`相比，`LinkedList`元素删除更快。

原因：`LinkedList`的每个元素都维护着两个指针（地址），这些指针指向列表中的两个邻居元素。因此，移除仅需要改变将要移除的节点的两个相邻节点（元素）中的指针位置。在`ArrayList`中，需要移动所有元素以填充由要移除的元素创建的空间。

3）**插入性能**：`LinkedList add`方法给出`O(1)`性能，而`ArrayList`在最坏情况下给出`O(n)`。原因与删除说明相同。

4）**内存开销**：`ArrayList`维护索引和元素数据，而`LinkedList`维护元素数据和相邻节点的两个指针，因此`LinkedList`中的内存消耗比较高。

这些类之间的**相似性很少，如下所示：**

1.  `ArrayList`和`LinkedList`都是`List`接口的实现。
2.  它们都维护元素的插入顺序，这意味着在显示`ArrayList`和`LinkedList`元素时，结果集将具有将元素插入`List`的相同顺序。
3.  这两个类都是非同步的，可以使用[`Collections.synchronizedList`](https://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedList(java.util.List))方法显式同步。
4.  这些类返回的迭代器和`listIterator`是快速失​​败的（如果在创建迭代器之后的任何时候对列表进行结构修改，除非通过迭代器自己的`remove`或`add`方法，迭代器将抛出 [`ConcurrentModificationException`](https://docs.oracle.com/javase/6/docs/api/java/util/ConcurrentModificationException.html)）。

### 何时使用`LinkedList`以及何时使用`ArrayList`？

1）如上所述，与 ArrayList（`O(n)`）相比，`insertList`和`remove`操作在`LinkedList`中提供了良好的性能（`O(1)`）。因此，如果在应用中需要频繁添加和删除，则`LinkedList`是最佳选择。

2）搜索（`get`方法）操作在`Arraylist`（`O(1)`）中很快但在`LinkedList`（`O(n)`中）没有，因此如果添加和删除操作较少且搜索操作要求较多，则`ArrayList`将是您最好的选择。

#### 参考：

*   [`ArrayList`文档](https://docs.oracle.com/javase/1.5.0/docs/api/java/util/ArrayList.html)
*   [`LinkedList` Javadoc](https://docs.oracle.com/javase/6/docs/api/java/util/LinkedList.html)