跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Arraylist与linkedlist
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Java基础导航}} == ArrayList与LinkedList == '''ArrayList'''和'''LinkedList'''是Java集合框架中两种最常用的列表实现,均实现了<code>List</code>接口,但在底层数据结构、性能特性和适用场景上有显著差异。理解它们的区别对编写高效Java程序至关重要。 === 概述 === * '''ArrayList''':基于动态数组实现,支持快速随机访问,但在中间插入/删除元素时效率较低。 * '''LinkedList''':基于双向链表实现,插入/删除高效,但随机访问性能较差。 === 底层数据结构 === <mermaid> graph LR subgraph ArrayList A[Object数组] --> B[自动扩容] end subgraph LinkedList C[Node] --> D["prev|item|next"] D --> E[前驱节点] D --> F[后继节点] end </mermaid> === 核心区别对比 === {| class="wikitable" |+ ArrayList vs LinkedList 特性对比 ! 特性 !! ArrayList !! LinkedList |- | '''数据结构''' | 动态数组 | 双向链表 |- | '''随机访问''' | O(1) | O(n) |- | '''头部插入''' | O(n) | O(1) |- | '''尾部插入''' | O(1) 均摊 | O(1) |- | '''中间插入''' | O(n) | O(1) 已知位置时 |- | '''内存占用''' | 更小(仅存储数据) | 更大(额外存储节点信息) |} === 代码示例 === ==== 基础操作对比 ==== <syntaxhighlight lang="java"> import java.util.*; public class ListComparison { public static void main(String[] args) { // 初始化 List<Integer> arrayList = new ArrayList<>(); List<Integer> linkedList = new LinkedList<>(); // 尾部插入性能 long start = System.nanoTime(); for (int i = 0; i < 100000; i++) arrayList.add(i); System.out.println("ArrayList尾部插入: " + (System.nanoTime()-start)/1e6 + "ms"); start = System.nanoTime(); for (int i = 0; i < 100000; i++) linkedList.add(i); System.out.println("LinkedList尾部插入: " + (System.nanoTime()-start)/1e6 + "ms"); // 随机访问性能 start = System.nanoTime(); arrayList.get(50000); System.out.println("ArrayList随机访问: " + (System.nanoTime()-start) + "ns"); start = System.nanoTime(); linkedList.get(50000); System.out.println("LinkedList随机访问: " + (System.nanoTime()-start) + "ns"); } } </syntaxhighlight> '''输出示例''': ArrayList尾部插入: 12.345ms LinkedList尾部插入: 15.678ms ArrayList随机访问: 150ns LinkedList随机访问: 24500ns === 扩容机制 === ArrayList的扩容需要数学计算: <math> newCapacity = oldCapacity + (oldCapacity >> 1) </math> 当添加元素超过当前容量时,ArrayList会创建一个新数组(大小为原数组的1.5倍),然后拷贝数据。 === 实际应用场景 === * '''使用ArrayList''': * 频繁随机访问(如<code>get(index)</code>) * 主要进行尾部操作 * 内存敏感的应用 * '''使用LinkedList''': * 频繁在任意位置插入/删除 * 实现队列/双端队列(实现了<code>Deque</code>接口) * 不需要大量随机访问 === 高级特性 === '''LinkedList特有方法''': <syntaxhighlight lang="java"> LinkedList<String> list = new LinkedList<>(); list.addFirst("Head"); // 等同于push() list.addLast("Tail"); String first = list.removeFirst(); // 等同于pop() String last = list.removeLast(); </syntaxhighlight> === 性能分析 === 对于n个元素的操作时间复杂度: {| class="wikitable" |+ 时间复杂度对比 ! 操作 !! ArrayList !! LinkedList |- | <code>add(E e)</code> | O(1) 均摊 | O(1) |- | <code>add(int index, E e)</code> | O(n) | O(1) 已知节点时 |- | <code>remove(int index)</code> | O(n) | O(1) 已知节点时 |- | <code>get(int index)</code> | O(1) | O(n) |} === 内存布局可视化 === <mermaid> graph TD subgraph ArrayList内存 A[引用1] --> B[连续内存块] C[引用2] --> B end subgraph LinkedList内存 D[引用1] --> E[节点A] E --> F[节点B] F --> G[节点C] G --> H[...] end </mermaid> === 最佳实践建议 === 1. 默认首选ArrayList(大多数场景更优) 2. 只有在频繁在列表'''中间'''插入删除时才考虑LinkedList 3. 使用<code>ListIterator</code>可以改善LinkedList的遍历性能 4. 使用<code>initialCapacity</code>参数优化ArrayList初始化 {{Java基础导航}} [[Category:计算机科学]] [[Category:面试技巧]] [[Category:Java基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
该页面使用的模板:
模板:Java基础导航
(
编辑
)