ArrayList和LinkedList的区别是什么

ArrayListLinkedList 分别代表了两类不同的数据结构:动态数组和链表。它们都实现了 Java 的 List 接口,但是有着各自独特的特点和性能表现。

1. 数据结构

  • ArrayList 是基于可调整大小的数组实现的。它允许快速随机访问,因为内部元素可通过数组索引直接访问。
  • LinkedList 是基于双向链表实现的。链表中的每个元素都包含了对其前一个和后一个元素的引用,允许双向遍历。

2. 性能特点

特性/操作ArrayListLinkedList
随机访问O(1)O(n)
添加元素(一般)O(1) (摊销时间)O(1)
在末尾添加元素O(1) (摊销时间)O(1)
在中间/开始添加元素O(n)O(1)
删除元素(一般)O(n)O(1)
内存开销较小 (只存数据)较大 (数据 + 两个引用)

3. 源码分析

  • ArrayList 源码关键部分
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable {transient Object[] elementData; // 存储数据private void ensureCapacityInternal(int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}if (minCapacity - elementData.length > 0) {grow(minCapacity);}}private void grow(int minCapacity) {// 扩容逻辑}public E get(int index) {rangeCheck(index);return elementData[index];}public boolean add(E e) {ensureCapacityInternal(size + 1);  // 确保容量elementData[size++] = e;return true;}// ...省略其他方法
}

ArrayList的核心是一个数组。当添加元素会超过当前数组大小时,会触发一个“扩容”操作,通常是将数组大小增加到当前大小的1.5倍。

  • LinkedList 源码关键部分
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable {transient Node<E> first;transient Node<E> last;private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}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;elsel.next = newNode;size++;modCount++;}// ...省略其他方法
}

LinkedList中的每个元素都是一个节点对象,包含了数据和两个指向其它节点的引用。

4. 代码演示

以下代码展示了ArrayListLinkedList的基本使用:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;public class ListExample {public static void main(String[] args) {List<String> arrayList = new ArrayList<>();List<String> linkedList = new LinkedList<>();// 添加元素arrayList.add("Element1");linkedList.add("Element1");// 在列表中间插入元素arrayList.add(0, "Element2"); // O(n)linkedList.add(0, "Element2"); // O(1), 只需要改变引用// 获取元素String elementFromArrayList = arrayList.get(1); // O(1)String elementFromLinkedList = linkedList.get(1); // O(n), 需要从头遍历链表// 删除元素arrayList.remove(0); // O(n)linkedList.remove(0); // O(1), 只需要改变引用}
}

5. 细节和使用场景

  • ArrayList

    • 优先选择,当需要频繁访问列表中的元素。
    • 注意处理扩容操作,可能会导致短暂的性能下降。
    • 更低的内存占用。
  • LinkedList

    • 当需要频繁进行添加和删除操作,尤其是在列表的开头或中间时,可以考虑使用。
    • 每个元素占用更多内存,因为存储了两个额外的引用。

理解这些区别和细节可以帮助你做出适合你应用场景的数据结构选择。尽管LinkedList在某些操作中有其优势,但由于内存使用和大多数操作中的性能影响,ArrayList通常是默认首选。只有在特定的、频繁进行插入和删除的场景下,LinkedList才是更好的选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/668575.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用useRoutes提示invalid hook call

包版本&#xff1a; 问题&#xff1a; 今天用vitereactts重新搭建项目时报错 代码&#xff1a; router.tsx import { useRoutes } from react-router-dom; import Home from "../pages/home/index";const routers[{path: /,element: <Home/> } ] // const…

c++ 语法 运算符重载

不要滥用运算符重载 内置类型不能使用运算符重载 号运算符重载 #include <iostream> #include "mathutil.hpp" #include <string> #include "People.hpp" #include "Phone.hpp" using namespace std; class Fclass{ public:int…

jmeter设置关联

一、为什么要设置关联&#xff1f; http协议本身是无状态的&#xff0c;客户端只需要简单向服务器请求下载某些文件&#xff0c;无论是客户端还是服务端都不去记录彼此过去的行为&#xff0c;每一次请求之间都是独立的。如果jmeter需要设置跨线程组脚本&#xff0c;就必须设置…

机器学习本科课程 实验4 支持向量机

第一题&#xff1a;支持向量机的核函数 实验内容&#xff1a; 了解核函数对SVM的影响绘制不同核函数的决策函数图像简述引入核函数的目的 1. 导入模型 import numpy as np import matplotlib.pyplot as plt %matplotlib inline from matplotlib.colors import ListedColorm…

【LeetCode: 292. Nim 游戏+ 博弈问题】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

vue绘制语音波形图---wavesurfer.js

文章目录 创建实例optionsmethod接收Blob流 https://wavesurfer.xyz/ 创建实例 引入插件&#xff1a;import WaveSurfer from "wavesurfer.js"创建实例对象&#xff1a;this.wavesurfer WaveSurfer.create(options); <div id"waveform"><!-- t…

MySQL 小技巧:xtrabackup 软件包的下载及安装

案例&#xff1a;xtrabackup 软件包的下载及安装 软件包下载&#xff1a;Index of /percona/centos/7/RPMS/x86_64/ CentOS7 默认的数据库版本比较老,因此建议使用 xtrabackup 2.4 版本 // CentOS7 默认的数据库版本比较老,因此建议使用 xtrabackup 2.4 版本 // 安装 CentOS7 默…

性能评测|虚拟化和裸金属 K8s 哪个性能更好?

本文重点 整体而言&#xff0c;SKS&#xff08;虚拟机 Kubernetes&#xff09;可以达到裸金属 Kubernetes 性能的 82% – 96%&#xff0c;满足绝大部分场景下生产容器应用的性能需求。更多虚拟化与裸金属 Kubernetes 架构、特性、适用场景与性能对比&#xff0c;欢迎阅读文末电…

L1-040 最佳情侣身高差-java

输入样例&#xff1a; 2 M 1.75 F 1.8输出样例&#xff1a; 1.61 1.96 import java.util.Scanner;public class Main { public static void main(String[] args) {Scanner scanner new Scanner(System.in);int nscanner.nextInt();String[][] strnew String[n][2];for(int i…

自定义Dockerfile构建运行springboot

自定义Dockerfile构建运行springboot 通过dockerfile生成自定义nginx镜像 &#xff01;&#xff01;&#xff01;docker 必须在linux环境下才能进行如果你是window则需要装虚拟机 新建一个文件名字为Dockerfile&#xff0c;无需后缀 文件完整名就是Dockerfile,也可以自定义d…

相同的树[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,…

敏捷软件研发管理流程- scrum

Leangoo领歌是一款永久免费的专业的敏捷开发管理工具&#xff0c;提供端到端敏捷研发管理解决方案&#xff0c;涵盖敏捷需求管理、任务协同、进展跟踪、统计度量等。 Leangoo领歌上手快、实施成本低&#xff0c;可帮助企业快速落地敏捷&#xff0c;提质增效、缩短周期、加速创新…

了解 WebSocket 和 TCP :有何不同

WebSocket — 双向通讯的艺术 简要概述 WebSocket 代表着WebSocket通讯协议&#xff0c;提供了一条用于客户端和服务器间实现实时、双向、全双工通信的渠道。在WebSocket引入之前&#xff0c;网页应用的数据更新依赖于频繁的轮询&#xff0c;这种做法不仅效率低下&#xff0c;…

[python] 过年燃放烟花

目录 新年祝福语 一、作品展示 二、作品所用资源 三、代码与资源说明 四、代码库 五、完整代码 六、总结 新年祝福语 岁月总是悄然流转&#xff0c;让人感叹时间的飞逝&#xff0c;转眼间又快到了中国传统的新年&#xff08;龙年&#xff09;。 回首过去&#xf…

大模型 AI Agent 详细介绍

"大模型 AI agent" 通常指的是基于大型预训练模型的人工智能助手或智能代理。这些 AI 代理利用了大规模的语言模型&#xff08;如 GPT-3、BERT、T5 等&#xff09;或其他类型的模型&#xff08;如图像识别模型、多模态模型等&#xff09;来模拟人类行为和决策过程。这…

异地办公必不可缺的远程控制软件,原理到底是什么?

目录 引言远程桌面连接软件的作用与重要性 基本概念与架构客户端-服务器模型网络通信协议 核心技术组件图形界面捕获与传输输入转发会话管理 性能优化策略带宽优化延迟优化 引言 远程桌面连接软件的作用与重要性 在当今这个高度数字化和网络化的时代&#xff0c;远程桌面连接软…

【动态规划】【状态压缩】【2次选择】【广度搜索】1494. 并行课程 II

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 状态压缩 广度优先搜索 LeetCode1494. 并行课程 II 给你一个整数 n 表示某所大学里课程的数目&#xff0c;编号为 1 到 n &#xff0c;数组 relations 中&#xff0c; relations[i] [xi, yi] 表示一个先修课的关系&am…

关于服务器解析A记录和CNAME记录的分析

内容提要: 大致讲下理解,dns域名解析这一块 0 . 问题来源 最近搞了一个七牛云上传,然后需要配置融合cdn加速,也就是可以加速域名,中间有一部需要CNAME 域名,也就是将七牛云提供的域名CNAME一下,查阅资料其实就是起一个别名,好访问而已. 方便我们访问云存储,达到加速的效果. …

论文阅读-一个用于云计算中自我优化的通用工作负载预测框架

论文标题&#xff1a;A Self-Optimized Generic Workload Prediction Framework for Cloud Computing 概述 准确地预测未来的工作负载&#xff0c;如作业到达率和用户请求率&#xff0c;对于云计算中的资源管理和弹性非常关键。然而&#xff0c;设计一个通用的工作负载预测器…

2024年碰到这三条红线的电车,坚决不买!

文 | AUTO芯球 作者 | 雷歌 我最近有天夜里打车打到一辆威马汽车&#xff0c;车里乌漆麻黑一片&#xff0c;我好奇地问&#xff0c;“师傅你中控屏咋不打开&#xff0c;太黑了。”师傅带有怨气地吐槽&#xff1a; “X&#xff0c;威马破产了&#xff0c;车机也停了”。 车子…