用 ArrayList 还是 LinkedList?看完你就懂了!

简介: ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

本文旨在为 Java 开发这择合适的顺序数据结构提供指导。


ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。


1. List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。


2. 用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

import java.util.*;
public class MyClass {
  // 非同步或非线程安全
  List<Object> arrayList = new ArrayList<>(); // 声明一个 array list
  List<Object> linkedList = new LinkedList(); // 声明 linked list
  // 确保线程安全
  List<Object> tsArrayList = Collections.synchronizedList(new LinkedList<>());
  List<Object> tsLinkedList = Collections.synchronizedList(new LinkedList<>());
}

Vector 与 ArrayList 类似,只是它们支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。


3. 内部实现

3.1 LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。 序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。


3.2 ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。 它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。


它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList<type>(initialCapacity)
List arr = new ArrayList<Integer>(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。 Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。


4. 各种操作的时空复杂性

image.png

5. 小贴士

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();
Object o = null;
for (int i = 0; i < list.size(); i++)
{
  o = list.get(i);
}

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();
Object o = null;
ListIterator li = list.listIterator(0);
while (li.hasNext()){
  o = ll.next();
}

6. 总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。 遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。 如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。


欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。


原文:https://dzone.com/articles/arraylist-or-linkedlist

翻译:唐尤华



image.png

相关文章
|
安全 应用服务中间件 Apache
Apache-Tomcat-Ajp文件读取漏洞(CVE-2020-1938、CNVD-2020-10487)
Apache-Tomcat-Ajp文件读取漏洞产生原因是由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件
1743 1
|
资源调度 前端开发 JavaScript
vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
【11月更文挑战第10天】本文介绍了在 Vite 3 + Vue 3 项目中使用 `javascript-obfuscator` 实现前端代码加密混淆的详细步骤,包括安装依赖、创建混淆脚本、修改 `package.json` 脚本命令、构建项目并执行混淆,以及在 HTML 文件中引用混淆后的文件。通过这些步骤,可以有效提高代码的安全性。
1672 2
|
缓存 资源调度
解决node升级到18版本node-sass安装问题
解决node升级到18版本node-sass安装问题
|
存储 Java Spring
Spring Batch:让你的数据洪流化作涓涓细流,批量处理的魔法盛宴!
【8月更文挑战第31天】在现代软件开发中,批量处理对于金融交易、数据仓库加载等数据密集型应用至关重要。Spring Batch作为Spring生态的一部分,提供了一套全面的框架,支持事务管理、错误处理、日志记录等功能,帮助开发者高效构建可靠且可扩展的批处理应用。本文将深入探讨其核心概念、关键特性和实际应用,并通过示例代码展示如何配置作业、步骤及读取器、处理器和写入器,帮助读者更好地理解和应用Spring Batch。
422 1
|
机器学习/深度学习 算法 开发工具
大语言模型的直接偏好优化(DPO)对齐在PAI-QuickStart实践
阿里云的人工智能平台PAI,作为一站式的机器学习和深度学习平台,对DPO算法提供了全面的技术支持。无论是开发者还是企业客户,都可以通过PAI-QuickStart轻松实现大语言模型的DPO对齐微调。本文以阿里云最近推出的开源大型语言模型Qwen2(通义千问2)系列为例,介绍如何在PAI-QuickStart实现Qwen2的DPO算法对齐微调。
|
SQL 关系型数据库 MySQL
MySQL删除表数据、清空表命令(truncate、drop、delete 区别)
MySQL删除表数据、清空表命令(truncate、drop、delete区别) 使用原则总结如下: 当你不需要该表时(删除数据和结构),用drop; 当你仍要保留该表、仅删除所有数据表内容时,用truncate; 当你要删除部分记录、且希望能回滚的话,用delete;
|
JSON 前端开发 Java
统一数据返回格式 及 可能遇到的问题;统一异常处理
统一数据返回格式需要创建一个新类并使其实现ResponseBodyAdvice 接口并重写里面的方法,然后给当前类加上@ControllerAdvice注解。 实际应用时还有几个问题: 问题一:重复打包 问题二:ClassCastException: com.example.Spring_demo.Resp cannot be cast to java.lang.String 统一异常处理需要使用两个注解@ExceptionHandler@ControllerAdvice
404 2
统一数据返回格式 及 可能遇到的问题;统一异常处理
springboot和elasticsearch以及springboot data elasticsearch对应的版本
springboot和elasticsearch以及springboot data elasticsearch对应的版本
1228 1
|
前端开发 Java 关系型数据库
xxl-job 登入功能集成 OIDC 统一认证
xxl-job 是一款 java 开发的、开源的分布式任务调度系统,自带了登录认证功能,不支持对接、扩展 LDAP 、OIDC 等标准认证系统,考虑到单独维护 xxl-job 自有的用户系统不方便,以及存在人员离职、调岗、权限变动等需要及时调整用户权限的情况,需要接入公司统一的 OIDC 认证系统
2383 0
|
监控 Java Maven
使用AspectJ实现Java代码的运行时织入
使用AspectJ实现Java代码的运行时织入

热门文章

最新文章