【八股文】ArrayList和LinkedList的区别

embedded/2025/3/21 2:17:44/

先讲讲两者是如何实现的

ArrayList

java">public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{transient Object[] elementData; private int size;
}

 通过源码可以看出,ArrayList实现是基于数组实现的

LinkedList

java">public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{transient int size = 0;/*** Pointer to first node.*/transient Node<E> first;/*** Pointer to last node.*/transient Node<E> last;
}private static class Node<E> {E item;Node<E> next;Node<E> prev;
}

 通过源码可以看出,LinkedList实现是基于双向链表的数据结构。

使用双向链表而不使用单链表是为了能支持反向遍历,快速删除尾部元素

接下来,我们分析下不同操作的情况下,它两的差异

列表头部插入

ArrayList每次头插都需要移动所有元素, 时间复杂度O(n^2)

LinkedList只需要修改指针,时间复杂度O(n)

随机访问

ArrayList直接通过索引计算内存地址,时间复杂度O(1)

LinkedList需要从头节点开始遍历,时间复杂度O(n)

空间复杂度对比

LinkedList比ArrayList多占用数倍的空间,因为LinkedList要多存前后指针等信息

总结

 最后留两个问题给大家思考下

java">//list是linkedlist
for(int i=0; i<list.size(); i++){System.out.println(list.get(i));
}
java">for(String s : list){if(s.equals("bug")){list.remove(s);}
}

上述代码有啥问题?


http://www.ppmy.cn/embedded/174307.html

相关文章

Android Audio基础(18)——最小缓冲区

在创建 AudioTrack 时有一个缓冲区大小的参数&#xff0c;最小缓冲区参数通过 AudioTrack.getMinBufferSize() 获取。 一、最小缓冲区 为了让音频数据通路能正常运转&#xff0c;共享FIFO必须达到最小缓冲区的大小。如果数据缓冲区分配得过小&#xff0c;那么播放声音会频繁遭…

uni-app——计时器和界面交互API

API 基本概要 概念说明 API&#xff08;应用程序接口&#xff09;是预先定义的方法集合&#xff0c;用于实现特定功能。在 uni-app 中&#xff0c;通过全局对象 uni 调用 API&#xff0c;例如 uni.getSystemInfoSync 获取设备信息。 API 分类与调用规则 事件监听型 以 on 开…

标准 Git Commit 模板格式指南

✅ 标准 Git Commit 模板格式指南 格式模板 <type>(<scope>): <subject><body> ← 可选&#xff0c;详细说明做了什么&#xff0c;为啥这么做&#x1f4cc; 常见的 <type> 类型说明 类型说明feat新增功能&#xff08;feature&#xff09;fix…

软考程序员考试知识点汇总

软考程序员考试&#xff08;初级资格&#xff09;主要考察计算机基础理论、编程能力及软件开发相关知识。以下是核心知识点总结及备考建议&#xff1a; 一、计算机基础 数制与编码 二进制、八进制、十进制、十六进制转换原码、反码、补码表示&#xff08;整数与浮点数&#xf…

设计模式(行为型)-备忘录模式

目录 定义 类图 角色 角色详解 &#xff08;一&#xff09;发起人角色&#xff08;Originator&#xff09;​ &#xff08;二&#xff09;备忘录角色&#xff08;Memento&#xff09;​ &#xff08;三&#xff09;备忘录管理员角色&#xff08;Caretaker&#xff09;​…

c++图论(四)之有向无环图特的拓扑排序

在 C 中实现有向无环图&#xff08;DAG&#xff0c;Directed Acyclic Graph&#xff09;的拓扑排序&#xff0c;可以通过两种经典方法&#xff1a;BFS遍历法和 DFS 后序遍历。以下是两种方法的实现原理、代码示例及详细说明&#xff1a; 一、拓扑排序的概念 拓扑排序&#xff…

软件测试之测试覆盖率

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 我们将讨论测试覆盖率的相关问题&#xff0c;以及它如何帮助提高软件质量的。 测试覆盖率概述 测试覆盖率被定义为一种测试技术指标&#xff0c;它表明我们的…

从一则笑话看需求分析:Bug定位与修复的实战经验及大型项目测试策略设计

引言阅读原文 某日&#xff0c;老师在课堂上想考考学生们的智商&#xff0c;就问一个男孩&#xff1a;“树上有十只鸟&#xff0c;开枪打死一只&#xff0c;还剩几只&#xff1f;” 男孩反问&#xff1a;“是无声枪么&#xff1f;” “不是。” “枪声有多大&#xff1f;” “…