# Java 中`ArrayList`和`LinkedList`之间的区别
> 原文: [https://javatutorial.net/difference-between-arraylist-and-linkedlist-in-java](https://javatutorial.net/difference-between-arraylist-and-linkedlist-in-java)
本文介绍了[`ArrayList`](https://javatutorial.net/java-arraylist-example)和[`LinkedList`](https://javatutorial.net/java-linkedlist-example)之间的区别,在这种情况下,我们应该优先选择一个。
由于继承了相同的接口 – `List`,因此`ArrayList`和`LinkedList`共享相同的属性。 但是`ArrayList`和`LinkedList`有什么区别? 简单地说 – `ArrayList`对于一次写入多次读取操作很有用,但不利于从前端或中间进行添加/删除。 另一方面,`LinkedList`更适合插入和删除数据。
## 性能表现
下表通过对`LinkedList`和`ArrayList`执行不同的操作来显示平均算法复杂度
![ArrayList vs. LinkedList operations complexity](https://img.kancloud.cn/40/ea/40eaf8dc4beb6767ddcdca1a9e89dc78_760x490.jpg)
`ArrayList`与`LinkedList`操作的复杂度
## [`ArrayList`](https://javatutorial.net/java-arraylist-example)与[`LinkedList`](https://javatutorial.net/java-linkedlist-example)性能示例
下面的示例演示使用`ArrayList`和`LinkedList`上的相同数据进行`add`,`set`和`remove`操作的性能
```java
package javatutorial.net;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class ArrayListVsLinkedListExample {
private static final int ELCOUNT = 50000;
public static void main(String[] args) {
List<String> alist = new ArrayList<String>();
List<String> llist = new LinkedList<String>();
// Insertion ////////////////
// ArrayList
long start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
alist.add("element #" + i);
}
long totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Adding 50K elements in ArrayList took " + totalTimeMs + " ms");
// LinkedList
start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
llist.add("element #" + i);
}
totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Adding 50K elements in LinkedList took " + totalTimeMs + " ms");
// Modification /////////////
// ArrayList
start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
alist.set(i, "modified element #" + i);
}
totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Modifying 50K elements in ArrayList took " + totalTimeMs + " ms");
// LinkedList
start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
llist.set(i, "modified element #" + i);
}
totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Modifying 50K elements in LinkedList took " + totalTimeMs + " ms");
// Removal //////////////////
System.out.println("ArrayList size before removal " + alist.size());
System.out.println("LinkedList size before removal " + llist.size());
// ArrayList
start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
alist.remove(0);
}
totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Removing 50K elements in ArrayList took " + totalTimeMs + " ms");
// LinkedList
start = System.currentTimeMillis();
for (int i = 0; i < ELCOUNT; i++) {
llist.remove(0);
}
totalTimeMs = System.currentTimeMillis() - start;
System.out.println("Removing 50K elements in LinkedList took " + totalTimeMs + " ms");
System.out.println("ArrayList size after removal " + alist.size());
System.out.println("LinkedList size after removal " + llist.size());
}
}
```
这是执行示例代码的输出。 结果将因不同的计算机配置而异
```java
Adding 50K elements in ArrayList took 10 ms
Adding 50K elements in LinkedList took 7 ms
Modifying 50K elements in ArrayList took 7 ms
Modifying 50K elements in LinkedList took 6315 ms
ArrayList size before removal 50000
LinkedList size before removal 50000
Removing 50K elements in ArrayList took 135 ms
Removing 50K elements in LinkedList took 4 ms
ArrayList size after removal 0
LinkedList size after removal 0
```
如您在上面的输出中看到的:
* `LinkedList`在访问和修改元素方面明显较慢
* `LinkedList`添加元素的速度较慢
* `LinkedList`从列表开头删除元素的速度要快得多
* `ArrayList`插入新元素的速度较慢
* `ArrayList`在访问和修改元素方面明显更快
* `ArrayList`从列表开头删除元素的速度明显较慢
## 结论
在所有情况下,算法复杂度和运算性能都不是恒定的。 您必须考虑两个主要因素 - 列表的大小以及我们使用的元素在列表中的放置位置(在开头,中间或结尾)。 唯一不变的规则是:如果要更快地检索元素,请使用`ArrayList`,如果要更快地处理数据,请使用`LinkedList`。
- JavaTutorialNetwork 中文系列教程
- Java 基础
- Java 概述
- 在 Ubuntu 上安装 Java 8 JDK
- Java Eclipse 教程
- Eclipse 快捷方式
- 简单的 Java 示例
- Java 基本类型
- Java 循环
- Java 数组
- Java 读取文件示例
- Java 对象和类教程
- 什么是面向对象编程(OOP)
- Java 封装示例
- Java 接口示例
- Java 继承示例
- Java 抽象示例
- Java 多态示例
- Java 中的方法重载与方法覆盖
- Java 控制流语句
- Java 核心
- 如何在 Windows,Linux 和 Mac 上安装 Maven
- 如何使用 Maven 配置文件
- 如何将自定义库包含到 Maven 本地存储库中
- 如何使用 JUnit 进行单元测试
- 如何使用 Maven 运行 JUnit 测试
- 如何在 Java 中使用 Maven 创建子模块
- 如何使用 Maven 创建 Java JAR 文件
- 如何使用 Maven 创建 Java WAR 文件
- JVM 解释
- Java 内存模型解释示例
- 捕获 Java 堆转储的前 3 种方法
- Java 垃圾收集
- Java 互斥量示例
- Java 信号量示例
- Java 并行流示例
- Java 线程同步
- Java 线程池示例
- Java ThreadLocal示例
- Java 中的活锁和死锁
- Java Future示例
- Java equals()方法示例
- Java Lambda 表达式教程
- Java Optional示例
- Java 11 HTTP 客户端示例
- Java 类加载器介绍
- Java 枚举示例
- Java hashCode()方法示例
- 如何测试独立的 Java 应用程序
- SWING JFrame基础知识,如何创建JFrame
- Java SWING JFrame布局示例
- 在JFrame上显示文本和图形
- 与JFrame交互 – 按钮,监听器和文本区域
- 如何使用 Maven 创建 Java JAR 文件
- Java Collection新手指南
- 选择合适的 Java 集合
- Java ArrayList示例
- Java LinkedList示例
- Java HashSet示例
- Java TreeSet示例
- Java LinkedHashSet示例
- Java EnumSet示例
- Java ConcurrentHashSet示例
- Java HashMap示例
- Java LinkedHashMap示例
- Java TreeMap示例
- Java EnumMap示例
- Java WeakHashMap示例
- Java IdentityHashMap示例
- Java SortedMap示例
- Java ConcurrentMap示例
- Java Hashtable示例
- Java 中ArrayList和LinkedList之间的区别
- Java HashMap迭代示例
- Java HashMap内联初始化
- Java 中HashMap和TreeMap之间的区别
- Java 图示例
- Java 深度优先搜索示例
- Java 广度优先搜索示例
- 不同的算法时间复杂度
- Java 序列化示例
- Java 反射示例
- Java 中的弱引用
- Java 8 日期时间 API
- Java 基本正则表达式
- 使用 Java 检索可用磁盘空间
- Java 生成 MD5 哈希和
- Java 增加内存
- Java 属性文件示例
- 如何在 Eclipse 上安装 Java 9 Beta
- Java 9 JShell 示例
- Java 9 不可变列表示例
- Java 9 不可变集示例
- Java 9 不可变映射示例
- Java 单例设计模式示例
- Java 代理设计模式示例
- Java 观察者设计模式示例
- Java 工厂设计模式
- Java 构建器设计模式
- Java 比较器示例
- Java 发送电子邮件示例
- Java volatile示例
- Java Docker 和 Docker 容器简介
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Java 中使用 MySQL 连接器
- 如何使用 Eclipse 调试 Java
- Java EE
- 如何在 Windows 10 中设置JAVA_HOME
- JavaBeans 及其组件简介
- 如何安装和配置 Tomcat 8
- 如何在 Tomcat 中部署和取消部署应用程序
- 从 Eclipse 运行 Tomcat
- Java Servlet 示例
- Java Servlet POST 示例
- Servlet 请求信息示例
- Servlet 注解示例
- 使用初始化参数配置 Java Web 应用程序
- Java Servlet 文件上传
- Java JSP 示例
- Glassfish 启用安全管理
- 如何使用 MySQL 配置 Glassfish 4
- Java 文件上传 REST 服务
- Glassfish 和 Jetty 的 Java WebSockets 教程
- 基于 Glassfish 表单的身份验证示例
- 如何使用 Java EE 和 Angular 构建单页应用程序
- Spring
- 在 Eclipse 中安装 Spring STS
- 使用 STS 创建简单的 Spring Web App
- Spring Web Framework 简介
- Java Docker 和 Docker 容器简介
- 在 Spring 中实现控制器
- Spring 中的PathVariable注解
- Spring 中的RequestBody注解
- Spring 中的RequestParam注解
- Spring 拦截器
- Spring IOC
- Java Spring IoC 容器示例
- Spring 中的DispatcherServlet
- Spring 示例中的依赖注入
- 实现 Spring MVC 控制器
- Spring ORM 简介
- 什么是 DAO 以及如何使用它
- 如何对 DAO 组件进行单元测试
- 如何对控制器和服务执行单元测试
- 安装和配置 MySQL 数据库和服务器以供 Spring 使用
- 如何在 Spring 中处理登录身份验证
- Spring Security 简介及其设置
- 如何使用 Spring 创建 RESTful Web 服务
- Spring CSRF 保护
- Spring 中基于 OAuth2 的身份验证和授权
- Spring Boot 简介
- Spring MVC 框架介绍
- Spring JDBC 简介
- 如何 docker 化 Spring 应用程序
- Spring 的@Autowired注解
- Spring AOP 中的核心概念和建议类型
- Sping Bean 简介
- 如何在 Java 中使用 MySQL 连接器
- 安卓
- 安装和配置 Android Studio
- 将 Android 设备连接到 Android Studio
- Android 简介,活动,意图,服务,布局
- 创建一个简单的 Android 应用
- 运行和调试 Android 应用程序
- 在虚拟设备上运行 Android 应用程序
- Android 活动示例
- Android 意图示例
- Android 服务示例
- Android 线性布局示例
- Android 相对布局示例
- Android Web 视图示例
- Android 列表视图示例
- Android 网格视图示例
- 带有ListAdapter的 Android ListView示例
- Android SQLite 数据库介绍
- Android SQLite 数据库示例
- Android 动画教程
- Android 中的通知
- Android 中的事件处理
- 如何在 Android 中发送带有附件的电子邮件
- 杂项
- 选择您的 JAVA IDE:Eclipse,NetBeans 和 IntelliJ IDEA
- Java S3 示例
- 如何在 Ubuntu 上为多个站点配置 Apache
- 如何在 Liferay DXP 中替代现成的(OOTB)模块
- 简单的 Git 教程
- 使用 Java 捕获网络数据包
- Selenium Java 教程
- 使用特定工作区运行 Eclipse
- 在 Eclipse 中安装 SVN
- 如何运行 NodeJS 服务器
- SQL 内连接示例
- SQL 左连接示例
- SQL 右连接示例
- SQL 外连接示例
- 树莓派
- Raspberry Pi 3 规格
- 将 Raspbian 安装到 SD 卡
- Raspberry Pi 首次启动
- 远程连接到 Raspberry Pi
- 建立 Raspberry Pi 远程桌面连接
- Raspberry Pi Java 教程
- 使用 PWM 的 Raspberry Pi LED 亮度调节
- Raspberry Pi 控制电机速度
- Raspberry Pi 用 Java 控制直流电机的速度和方向