💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# 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)