当前位置: 首页 > wzjs >正文

深圳苍松大厦 网站建设校园微网站建设

深圳苍松大厦 网站建设,校园微网站建设,网站建设播放vr视频,正能量软件不良网站直播一、引言 在Java集合框架中,ArrayList和LinkedList是两种最常用的List实现类。尽管它们都实现了相同的接口,但底层数据结构的差异导致它们在随机访问、插入删除、内存占用等场景下的性能表现截然不同。本文将结合源码解析、时间复杂度分析和JMH基准测试…

一、引言

在Java集合框架中,ArrayListLinkedList是两种最常用的List实现类。尽管它们都实现了相同的接口,但底层数据结构的差异导致它们在随机访问、插入删除、内存占用等场景下的性能表现截然不同。本文将结合源码解析、时间复杂度分析和JMH基准测试,深入探讨两者的性能差异,并给出实际开发中的选择建议。


二、数据结构对比

1. ArrayList:动态数组

  • 底层实现:基于Object[]数组,支持自动扩容。
  • 扩容机制:默认初始容量为10,扩容时容量增长为原来的1.5倍。
  • 特点:内存连续,支持快速随机访问。

2. LinkedList:双向链表

  • 底层实现:每个元素通过Node节点(包含前驱、后继指针)连接。
  • 特点:内存非连续,插入删除高效,但随机访问性能差。

核心代码对比

// ArrayList的add方法核心逻辑
public boolean add(E e) {ensureCapacityInternal(size + 1);  // 扩容检查elementData[size++] = e;           // 直接写入数组return true;
}// LinkedList的add方法核心逻辑
public boolean add(E e) {linkLast(e);  // 创建新节点并调整指针return true;
}
void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) first = newNode;else l.next = newNode;size++;
}

三、关键操作性能分析

1. 随机访问性能测试
public class ListPerformanceTest {private static final int SIZE = 100_000;private static final int TEST_COUNT = 10_000;public static void main(String[] args) {// 初始化数据List<Integer> arrayList = new ArrayList<>();List<Integer> linkedList = new LinkedList<>();for (int i = 0; i < SIZE; i++) {arrayList.add(i);linkedList.add(i);}// 随机访问测试testRandomAccess("ArrayList", arrayList);testRandomAccess("LinkedList", linkedList);}private static void testRandomAccess(String name, List<Integer> list) {long startTime = System.nanoTime();for (int i = 0; i < TEST_COUNT; i++) {int index = (int) (Math.random() * SIZE);Integer value = list.get(index);}long endTime = System.nanoTime();System.out.printf("%-10s 随机访问耗时: %d ms\n", name, (endTime - startTime) / 1_000_000);}
}

运行结果

ArrayList 随机访问耗时: 3 ms  
LinkedList 随机访问耗时: 403ms

2. 头部插入性能测试
public static void main(String[] args) {testAddFirst("ArrayList", new ArrayList<>());testAddFirst("LinkedList", new LinkedList<>());
}private static void testAddFirst(String name, List<Integer> list) {long startTime = System.nanoTime();for (int i = 0; i < TEST_COUNT; i++) {list.add(0, i); // 头部插入}long endTime = System.nanoTime();System.out.printf("%-10s 头部插入耗时: %d ms\n", name, (endTime - startTime) / 1_000_000);
}

运行结果

ArrayList 头部插入耗时: 4 ms  
LinkedList 头部插入耗时: 1 ms

3. 中间插入性能测试
public static void main(String[] args) {testAddMiddle("ArrayList", new ArrayList<>());testAddMiddle("LinkedList", new LinkedList<>());
}private static void testAddMiddle(String name, List<Integer> list) {// 预先填充数据for (int i = 0; i < SIZE; i++) {list.add(i);}long startTime = System.nanoTime();for (int i = 0; i < TEST_COUNT; i++) {int index = list.size() / 2;list.add(index, i); // 中间插入}long endTime = System.nanoTime();System.out.printf("%-10s 中间插入耗时: %d ms\n", name, (endTime - startTime) / 1_000_000);
}

运行结果

ArrayList 中间插入耗时: 40 ms  
LinkedList 中间插入耗时: 693 ms

4. 迭代遍历性能测试
public static void main(String[] args) {testIteration("ArrayList", new ArrayList<>());testIteration("LinkedList", new LinkedList<>());
}private static void testIteration(String name, List<Integer> list) {// 预先填充数据for (int i = 0; i < SIZE; i++) {list.add(i);}long startTime = System.nanoTime();for (Integer value : list) { // 增强for循环遍历// 模拟读取操作}long endTime = System.nanoTime();System.out.printf("%-10s 迭代遍历耗时: %d ms\n", name, (endTime - startTime) / 1_000_000);
}

运行结果

ArrayList 迭代遍历耗时: 1 ms  
LinkedList 迭代遍历耗时: 1 ms

性能对比总结表

操作类型ArrayList 耗时 (ms)LinkedList 耗时 (ms)性能差距倍数
随机访问3403134.3x
头部插入410.25x
中间插入4069317.325x
迭代遍历111x

结论

  1. 随机访问ArrayList 性能碾压 LinkedList(快 134 倍)。
  2. 头部插入LinkedList 胜与 ArrayList(快 0.25 倍)。
  3. 中间插入ArrayList 仍优于 LinkedList(快 17 倍),因 LinkedList 需遍历到中间位置。
  4. 迭代遍历ArrayList 稍快,得益于 CPU 缓存优化。

:测试环境为 JDK 1.8.0_321,i3-12100 CPU,结果可能因硬件差异略有不同。


四、内存占用对比

1. 空间复杂度

  • ArrayList:存储元素本身,内存紧凑。
  • LinkedList:每个元素需额外存储两个指针(前驱、后继),占用更多内存。

内存占用计算(假设对象大小为16B)

// ArrayList存储1000个元素
总内存 ≈ 1000 * 16B + 数组开销 ≈ 16KB// LinkedList存储1000个元素
每个Node16B(数据) + 8B(前驱指针) + 8B(后继指针) = 32B
总内存 ≈ 1000 * 32B = 32KB

五、实际应用场景建议

选择ArrayList的情况

  1. 频繁随机访问:如按索引读取数据。
  2. 尾部插入删除add()remove()在尾部操作时,ArrayList性能接近O(1)。
  3. 内存敏感场景:需存储大量数据且内存有限。

选择LinkedList的情况

  1. 频繁头部操作:如实现栈(Stack)或队列(Queue)。
  2. 中间插入删除极少:仅在已知节点位置时高效。

替代方案

  • 随机插入删除频繁:考虑TreeSet(有序)或LinkedHashMap
  • 高并发场景:使用CopyOnWriteArrayListConcurrentLinkedQueue

六、误区澄清

  • 误区1:LinkedList在任何插入场景下都比ArrayList快。
    真相:只有在已知位置(如头部)时高效,随机插入仍需遍历。
  • 误区2:ArrayList扩容会导致性能灾难。
    真相:扩容分摊时间复杂度为O(1),合理设置初始容量可避免频繁扩容。

七、总结

维度ArrayListLinkedList
随机访问快(O(1))慢(O(n))
头部插入/删除慢(O(n))快(O(1))
内存占用
适用场景读多写少、随机访问频繁写多读少、头部操作频繁

最终建议:在大多数业务场景中,ArrayList是更优选择。仅在需要频繁操作头部或实现特定数据结构(如队列)时,才考虑使用LinkedList


文章转载自:

http://tXiG9o5f.xqjrg.cn
http://0hu9cfzG.xqjrg.cn
http://fo5Gt3e6.xqjrg.cn
http://KLCVcEwy.xqjrg.cn
http://QERWkcGL.xqjrg.cn
http://huZxw8qV.xqjrg.cn
http://zVgrehlk.xqjrg.cn
http://jygjEj1F.xqjrg.cn
http://xtlgBY89.xqjrg.cn
http://BYfkaRLQ.xqjrg.cn
http://QPAPb7yK.xqjrg.cn
http://7I0Ofi7f.xqjrg.cn
http://2JHE1FgE.xqjrg.cn
http://qUNT3sTs.xqjrg.cn
http://8BXaWq22.xqjrg.cn
http://pC29jOfJ.xqjrg.cn
http://dq50iOm9.xqjrg.cn
http://0Ea2V1du.xqjrg.cn
http://mTqIIxDa.xqjrg.cn
http://fggT9Q9l.xqjrg.cn
http://1hfucvGD.xqjrg.cn
http://H3cY9KKW.xqjrg.cn
http://ymX92VOt.xqjrg.cn
http://6NOuMq5q.xqjrg.cn
http://Mror2POw.xqjrg.cn
http://w8BPeCiI.xqjrg.cn
http://2AxH3kFr.xqjrg.cn
http://lpl1HVyK.xqjrg.cn
http://zqo0Xa3M.xqjrg.cn
http://0bIOOBKh.xqjrg.cn
http://www.dtcms.com/wzjs/639044.html

相关文章:

  • 英文网站上海网站建设 paiky
  • 购物网站建设特色美容院网站建设
  • 选择锦州网站建设wordpress 文字背景颜色
  • 简单做动画的网站wordpress oss cdn
  • 4在线做网站如果做淘宝网站
  • 怎样建设购物网站住房和城乡建设部监理工程师网站
  • 网站建设及使用方案山东省建设工程网站
  • 可信网站查询官网网站班级文化建设
  • 淮滨网站建设公司wordpress po翻译
  • php网站建设实例网站专业建设公司
  • 网站建设 的类型有哪些方面电脑软件商店
  • 优秀网站优点军事热点最新情况
  • 贵州省住房和城乡建设厅网站报名网公司网站维护工作内容
  • 建设银行网站上改手机号码wordpress 展开折叠
  • 网站的概念jq动画效果网站
  • 重庆定制网站开发中国最牛的十大企业
  • 网站开发所需硬件国际购物平台
  • 专业外贸网站建设网站被恶意刷流量
  • 唐山模板网站建设广告网站模板下载不了
  • 艾奇视觉网站建设酒店网站建设方案
  • 信用平台网站建设建议自己可以做网站推广吗
  • 如何设计出更好用户体验的网站初学者毕业设计做网站
  • 云梦网络建站重庆市万州建设工程信息网
  • 外贸网站建设广告旅行社网站方案
  • 网站在线制作平台qq网页即时聊天
  • 做360网站优化wordpress5.0代码执行
  • 专业的东莞网站推广安装wordpress 脚本
  • 网站制作国内知名企业wordpress 页面下载
  • 山西威力网站建设推荐wordpress 去掉评论框
  • python做网站商城开发wordpress 父页面跳转