ArrayList与LinkedList的区别是什么?
ArrayList与LinkedList是Java集合框架中实现List接口的两种常见类,它们各自具有独特的数据结构和特点,适用于不同的应用场景。
一、底层数据结构
ArrayList和LinkedList的底层数据结构是它们之间最本质的区别。
-
ArrayList:
ArrayList是基于数组实现的。它使用了一个动态数组来存储元素,这个数组的大小会根据需要自动增长。当向ArrayList中添加元素时,如果数组已满,就会创建一个更大的新数组,并将旧数组中的元素复制到新数组中。这种实现方式使得ArrayList在随机访问元素时非常高效,因为可以通过索引直接定位到元素的位置。然而,在插入和删除元素时,特别是当插入或删除位置靠近数组开头时,可能需要移动大量的元素,导致性能下降。 -
LinkedList:
LinkedList是基于链表实现的,具体来说,是双向链表。每个元素(节点)都包含数据部分和两个指针,一个指向前一个节点,一个指向后一个节点。这种结构使得LinkedList在插入和删除元素时非常高效,因为只需要修改相邻节点的指针即可,而不需要移动其他元素。然而,在随机访问元素时,LinkedList需要从头节点开始遍历链表,直到找到目标元素,因此效率较低。
二、性能差异
由于底层数据结构的不同,ArrayList和LinkedList在性能上表现出显著的差异。
-
随机访问性能:
对于随机访问操作(如get和set),ArrayList的性能优于LinkedList。因为ArrayList底层是数组结构,可以通过索引直接定位元素,时间复杂度为O(1)。而LinkedList需要遍历链表才能找到指定位置的元素,时间复杂度为O(n)。因此,在需要频繁进行随机访问的场景中,ArrayList是更好的选择。 -
插入和删除性能:
对于插入和删除操作(如add和remove),LinkedList的性能优于ArrayList。因为LinkedList是链表结构,插入和删除元素时只需要修改相邻节点的指针即可,时间复杂度为O(1)(在已知位置的情况下)。而ArrayList在插入或删除元素时,可能需要移动大量的元素(特别是在插入或删除位置靠近数组开头时),时间复杂度为O(n)。因此,在需要频繁进行插入和删除操作的场景中,LinkedList是更好的选择。
三、内存占用
ArrayList和LinkedList在内存占用方面也有所不同。
-
ArrayList:
ArrayList的内存占用主要取决于数组的大小和元素的数量。由于数组是连续存储的,因此ArrayList在内存中的布局相对紧凑。然而,当ArrayList需要扩容时,会创建一个更大的新数组,并将旧数组中的元素复制到新数组中,这会导致一定的内存开销。此外,ArrayList还需要额外的空间来存储数组的长度和容量等信息。 -
LinkedList:
LinkedList的内存占用相对较高。因为每个节点都需要存储数据部分和两个指针(指向前一个节点和后一个节点),这增加了节点的内存占用。此外,由于链表是分散存储的,因此在遍历链表时可能会涉及更多的内存访问操作。然而,LinkedList不需要像ArrayList那样在扩容时复制整个数组,因此在某些情况下可能会减少内存开销。
四、使用便利性
在使用便利性方面,ArrayList和LinkedList各有优缺点。
-
ArrayList:
ArrayList的使用相对简单方便。它提供了动态的增加和减少元素的功能,并实现了ICollection和IList接口等好处。此外,ArrayList还支持通过索引直接访问元素和修改元素的值。这使得ArrayList在编写代码时更加直观和易于理解。然而,由于ArrayList在插入和删除元素时可能需要移动大量的元素,因此在某些情况下可能会导致性能问题。 -
LinkedList:
LinkedList的使用相对复杂一些。由于它是链表结构,因此在插入和删除元素时需要处理指针的修改。此外,LinkedList还提供了在头部和尾部添加/删除元素的方法等额外功能。这使得LinkedList在某些特定场景中(如实现队列和栈等数据结构)更加灵活和高效。然而,由于LinkedList在随机访问元素时需要遍历链表,因此在某些情况下可能会导致性能下降。
五、应用场景
根据ArrayList和LinkedList的特点和性能差异,它们适用于不同的应用场景。
- ArrayList应用场景:
- 需要频繁进行随机访问的场景,如查找、修改和遍历元素等。
- 元素数量相对稳定或变化不大的场景,以减少扩容和复制数组的开销。
- 对内存占用要求较高的场景,因为ArrayList的内存布局相对紧凑。
- LinkedList应用场景:
- 需要频繁进行插入和删除操作的场景,如动态添加和删除元素等。
- 元素数量变化较大的场景,以减少移动元素的开销。
- 需要实现队列、栈等数据结构的场景,因为LinkedList提供了额外的操作方法。
六、示例代码
以下是一个示例代码,展示了ArrayList和LinkedList在插入和删除操作以及随机访问操作方面的性能差异。
import java.util.ArrayList; | |
import java.util.LinkedList; | |
import java.util.List; | |
public class ListExample { | |
public static void main(String[] args) { | |
// 创建一个ArrayList和一个LinkedList | |
List<Integer> arrayList = new ArrayList<>(); | |
List<Integer> linkedList = new LinkedList<>(); | |
// 向两个列表添加10000个元素 | |
for (int i = 0; i < 10000; i++) { | |
arrayList.add(i); | |
linkedList.add(i); | |
} | |
// 在第5000个位置插入一个新元素 | |
arrayList.add(5000, 9999); | |
linkedList.add(5000, 9999); | |
// 删除第5000个元素 | |
arrayList.remove(5000); | |
linkedList.remove(5000); | |
// 测量插入和删除操作的时间 | |
long arrayListInsertTime = measureInsertTime(arrayList); | |
long linkedListInsertTime = measureInsertTime(linkedList); | |
long arrayListRemoveTime = measureRemoveTime(arrayList); | |
long linkedListRemoveTime = measureRemoveTime(linkedList); | |
// 打印结果 | |
System.out.println("ArrayList insert time: " + arrayListInsertTime + "ms"); | |
System.out.println("LinkedList insert time: " + linkedListInsertTime + "ms"); | |
System.out.println("ArrayList remove time: " + arrayListRemoveTime + "ms"); | |
System.out.println("LinkedList remove time: " + linkedListRemoveTime + "ms"); | |
} | |
// 测量在列表的中间插入元素的时间 | |
public static long measureInsertTime(List<Integer> list) { | |
long startTime = System.currentTimeMillis(); | |
for (int i = 0; i < 10000; i++) { | |
list.add(list.size() / 2, i); | |
} | |
long endTime = System.currentTimeMillis(); | |
return endTime - startTime; | |
} | |
// 测量删除列表的元素的时间 | |
public static long measureRemoveTime(List<Integer> list) { | |
long startTime = System.currentTimeMillis(); | |
for (int i = 0; i < 10000; i++) { | |
list.remove(list.size() / 2); | |
} | |
long endTime = System.currentTimeMillis(); | |
return endTime - startTime; | |
} | |
} |
运行以上代码,可以看到LinkedList在插入和删除操作方面比ArrayList更高效,但在随机访问和遍历方面ArrayList相对更高效一些。这验证了ArrayList和LinkedList在性能方面的差异。
七、总结
综上所述,ArrayList和LinkedList是Java集合框架中实现List接口的两种常见类。它们各自具有独特的数据结构和特点,适用于不同的应用场景。ArrayList基于数组实现,适用于需要频繁进行随机访问的场景;而LinkedList基于链表实现,适用于需要频繁进行插入和删除操作的场景。在选择使用哪个类时,需要根据具体的应用场景和需求进行权衡和选择。
相关文章:
ArrayList与LinkedList的区别是什么?
ArrayList与LinkedList是Java集合框架中实现List接口的两种常见类,它们各自具有独特的数据结构和特点,适用于不同的应用场景。 一、底层数据结构 ArrayList和LinkedList的底层数据结构是它们之间最本质的区别。 ArrayList: ArrayList是基于…...
《Java-数组》
《Java-数组》 1.数组介绍 概念:数组是一种容器,用来存储同种数据类型的多个值。注意:数组容器在存储数据的时候,需要结合隐式转换考虑; 2.数组的定义和初始化 2.1数组定义 定义格式1(常用)…...
Docker 实战:搭建本地 Registry 私有镜像仓库及批量导入脚本
前言:在我之前的博客中,我分享了 Harbor 仓库搭建的详细操作步骤。然而,在实际的生产环境中,并非每个 Docker 环境都需要部署一个规模庞大的 Harbor 仓库。有时,一个轻量级的本地 Registry 私有镜像仓库会更为便捷。本…...
MySQL 启动失败问题分析与解决方案:`mysqld.service failed to run ‘start-pre‘ task`
目录 前言1. 问题背景2. 错误分析2.1 错误信息详解2.2 可能原因 3. 问题排查与解决方案3.1 检查 MySQL 错误日志3.2 验证 MySQL 配置文件3.3 检查文件和目录权限3.4 手动启动 MySQL 服务3.5 修复 systemd 配置文件3.6 验证依赖环境 4. 进一步优化与自动化处理结语 前言 在日常…...
java-分而治之算法
分而治之(Divide and Conquer)算法是一种解决问题的策略,它将一个复杂的问题分解成若干个相同或相似的子问题,递归地解决这些子问题,然后将它们的解合并以解决原始问题。这种算法通常用于排序、搜索、数学计算等领域。…...
透明化教育管理:看板如何提升班级整体效率
随着教育信息化的不断推进,传统的教学和班级管理方式逐渐暴露出时间紧、任务繁、多任务并行等问题。看板管理,作为一种高效的可视化工具,正在成为教师管理教学、提升班级协作与互动的重要利器。通过透明化、系统化的管理方式,看板…...
UDP客户端服务器通信
在这篇博客中,我们将探索 UDP(用户数据报协议) 通信,简要地说,UDP 是一种无连接、快速但不可靠的通信协议,适用于需要快速数据传输但对丢包容忍的场景,比如视频流和在线游戏。就像《我是如此相信…...
helm手动部署Kafka集群
1、到指定node节点创建pv需挂载的目录,若有分布式存储可忽略 mkdir -p /data/kafka-data-0 mkdir -p /data/kafka-data-1 mkdir -p /data/kafka-data-2 mkdir -p /data/kafka-zookeeper-data-0 2、创建pvc ---apiVersion: v1kind: PersistentVolumemetadata:n…...
vue3 ajax获取json数组排序举例
使用axios获取接口数据 可以在代码中安装axios包,并写入到package.json文件: npm install axios -S接口调用代码举例如下: const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…...
c/c++ 用easyx图形库写一个射击游戏
#include <graphics.h> #include <conio.h> #include <stdlib.h> #include <time.h>// 定义游戏窗口的大小 #define WINDOW_WIDTH 800 #define WINDOW_HEIGHT 600// 定义玩家和目标的尺寸 #define PLAYER_SIZE 50 #define TARGET_SIZE 20// 玩家的结构…...
大数据新视界 -- 大数据大厂之 Hive 数据安全:权限管理体系的深度解读(上)(15/ 30)
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...
gitee:创建仓库,存入本地文件至仓库
一、git下载 git:下载与安装-CSDN博客https://blog.csdn.net/weixin_46001736/article/details/144107485?sharetypeblogdetail&sharerId144107485&sharereferPC&sharesourceweixin_46001736&spm1011.2480.3001.8118 二、创建仓库 1、主页面->右上角新增…...
联想品牌的电脑 Bios 快捷键是什么?如何进入 Bios 设置?
在某些情况下,您可能需要通过U盘来安装操作系统或进行系统修复。对于联想电脑用户来说,了解如何设置U盘作为启动设备是非常有用的技能之一。本文简鹿办公将指导您如何使用联想电脑的 U 盘启动快捷键来实现这一目标。 联想笔记本 对于大多数联想笔记本电…...
微信小程序用户登录页面制作教程
微信小程序用户登录页面制作教程 前言 在微信小程序的开发过程中,用户登录是一个至关重要的功能。通过用户登录,我们可以为用户提供个性化的体验,保护用户数据,并实现更复杂的业务逻辑。本文将为您详细讲解如何制作一个用户登录页面,包括设计思路、代码示例以及实现细节…...
Flink细粒度的资源管理
Apache Flink致力于为所有应用程序自动导出合理的默认资源需求。对于希望根据其特定场景微调其资源消耗的用户,Flink提供了细粒度的资源管理。这里我们就来看下细粒度的资源管理如何使用。(注意该功能目前仅对DataStream API有用) 1. 适用场景 使用细粒度的资源管理的可能…...
Jenkins环境搭建及简单介绍
一、jenkins介绍 1、持续集成(CI) Continuous integration 持续集成 团队开发成员每天都有集成他们的工作,通过每个成员每天至少集成一次,也就意味着一天有可 能多次集成。在工作中我们引入持续集成,通过持续集成自动…...
如何还原 HTTP 请求日志中的 URL 编码参数?详解 %40 到 @
在记录HTTP请求的日志中出现了这样的情况: 2024-11-20 11:12:49 INFO network_request gz_login 96 Body: countryAbbrCN&countryCode86&email1222405567%40qq.com&password12354e50456db124f9f34e2789308733&type1 出现这种情况的原因是&#x…...
box-im学习
box-im gitee代码 box-im 语雀文档 box-im 在线体验 部署说明 需要启动下列服务 ## ## 1、启动minio ## MINIO_ROOT_USERminioadmin MINIO_ROOT_PASSWORDxxx nohup /boxim/minio/minio server /boxim/minio/data --console-address ":9001" --address "…...
faiss库中ivf-sq(ScalarQuantizer,标量量化)代码解读-6
调试 经过gdb调试获取的调用栈内容如下,链接: 步骤函数名称文件位置说明1faiss::IndexFlatCodes::add/faiss/IndexFlatCodes.cpp:24在 add 方法中,检查是否已经训练完成,准备添加向量到索引中。2std::vector<unsigned char&g…...
flutter开发环境—Windows
一、简介 我们使用最新版的flutter版本安装。 参考链接 名称地址官方网站https://flutter.dev/官方中文网站文档 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter软件下载路径https://docs.flutter.dev/release/archive?tabwindows 二、操作流程 2.1 下载软件 点…...
【计网】自定义序列化反序列化(二) —— 实现网络版计算器【上】
🌎 实现网络版计算器【上】 文章目录: 实现网络版计算器【上】 自定义协议 制定自定义协议 Jsoncpp序列化反序列化 Json::Value类 Jsoncpp序列化 Jsoncpp反序列化 自定义协议序列化反序列化 …...
Harbor安装、HTTPS配置、修改端口后不可访问?
Harbor安装、HTTPS配置、修改端口后不可访问? 大家好,我是秋意零。今天分享Harbor相关内容,安装部分可完全参考官方文档,写的也比较详细。 安装Harbor 官方文档:https://goharbor.io/docs/2.12.0/install-config/ …...
React中高阶组件HOC详解
高阶组件(Higher-Order Component,简称 HOC)是 React 中的一种设计模式,用于复用组件逻辑。它本质上是一个函数,接收一个组件作为参数,并返回一个新的组件。 1. HOC 的定义 HOC 是一个函数,类…...
网络原理(一)—— http
什么是 http http 是一个应用层协议,全称为“超文本传输协议”。 http 自 1991 年诞生,目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的,例如 http1.0,http1.0,http2.0 http3 是…...
redis学习面试
1、数据类型 string 增删改查 set key valueget keydel kstrlen k 加减 incr articleincrby article 3decr articledecyby article 取v中特定位置数据 getrange name 0 -1getrange name 0 1setrange name 0 x 设置过期时间 setex pro 10 华为 等价于 set pro 华为expire pro…...
前端工程化18-邂逅Promise(待更新)
6、邂逅Promise 6.1、函数对象与实例对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>准备_函数对象与实例对象</title> </head> <body><script>/* 函数对象、实例对象…...
Linux(ubuntu)系统的一些基本操作和命令(持续更新)
操作: Ctrl Alt T(打开命令终端) Ctrl Shift (放大命令终端窗口) Ctrl c(退出当前在终端运行的程序) 在命令终端窗口按Tab键可以补全要写的命令 命令: pwd(查…...
IDEA Mac快捷键(自查询使用)
Editing(编辑) Control Space 基本的代码补全(补全任何类、方法、变量)Control Shift Space 智能代码补全(过滤器方法列表和变量的预期类型)Command Shift Enter 自动结束代码,行末自动添…...
认识redis 及 Ubuntu安装redis
文章目录 一. redis概念二. redis应用场景二. redis的特性四. 使用Ubuntu安装redis 一. redis概念 redis 是在内存中存储数据的中间件, 用在分布式系统 redis是客户端服务器结构的程序, 客户端服务器之间通过网络来通信 二. redis应用场景 redis可用作数据库 类似MySQL, 但…...
6.结果处理组件之ResponseHandler
前言 feign发送完请求后, 拿到返回结果, 那么这个返回结果肯定是需要经过框架进一步处理然后再返回到调用者的, 其中ResponseHandler就是用来处理这个返回结果的, 这也是符合正常思维的处理方式, 例如springmvc部分在调用在controller端点前后都会增加扩展点。 从图中可以看得…...
【C#】调用外部应用
以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序(Matplotlib绘制图形程序),将调用PYTHON程序生成的窗口程序嵌入在WINFORM窗口中 窗口程序类 using System; using System.Collections.Generic; using System.Data; using S…...
JavaWeb--JDBC
JDBC(Java Database Connectivity,Java数据库连接)是一种Java API,可以让Java程序连接到数据库并进行数据的操作。它是Java平台的一部分,由Sun Microsystems(现为Oracle Corporation的一部分)开…...
神经网络归一化方法总结
在深度学习中,归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结,包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…...
Debian/Ubuntu 、Fedora 、Arch Linux, 在Linux上,对文本文件进行多线程压缩 xz、pxz、zstd、7z、lrzip
Debian/Ubuntu 、Fedora 、Arch Linux, 在Linux上,对文本文件进行多线程压缩 xz、pxz、zstd、7z、lrzip 前言对比多线程压缩1. 使用 pxz安装 pxz使用 pxz 2. 使用 xz 的 -T 选项使用 xz -T 3. 其他压缩命令1. 使用 gzip2. 使用 bzip23. 使用 xz4. 使用 7…...
前端使用fontfaceobserver库实现字体设置
要使用FontFaceObserver来加载设置项目本地的字体,先确保字体文件位于项目中或者可以从服务端获取到,这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步: npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…...
SSM--SpringMVC复习(二)
请求 URL匹配: RequestMapping RequestMapping 负责将请求映射到对应的控制器方法上。 RequestMapping 注解可用于类或方法上。用于类上,表示类中的所有响应请求的方法都以该地址作为父路径。 在整个 Web 项目中,RequestMapping 映射的请求…...
Oracle 11gR2 坏块修复实例一则
背景 前段时间在 Oracle 11gR2 数据库中发现了坏块问题。环境是 64 位 Linux 平台。本文将详细介绍如何使用 DBMS_REPAIR 进行在线修复,当然也可以基于备份和 RMAN 的修复方法这里暂时不做介绍。 发现坏块 1. 从 alert.log 中发现错误 在 alert.log 文件中发现了…...
使用 Docker Compose 来编排部署LMTNR项目
使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用,并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…...
el-table 根据屏幕大小 动态调整max-height 的值
<template><div><p>窗口高度:{{ windowHeight }} px</p></div> </template><script> export default {data() {return {// 下面的 -250 表示减去一些表单元素高度 这个值需要自己手动调整windowHeight: document.docume…...
el-cascader 使用笔记
1.效果 2.官网 https://element.eleme.cn/#/zh-CN/component/cascader 3.动态加载(官网) <el-cascader :props"props"></el-cascader><script>let id 0;export default {data() {return {props: {lazy: true,lazyLoad (…...
Cookie概念和API
Cookie概念 Cookie在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的,随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来,当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器…...
Linux服务器安装mongodb
因为项目需要做评论功能,领导要求使用mongodb,所以趁机多学习一下。 在服务器我们使用docker安装mongodb 1、拉取mongodb镜像 docker pull mongo (默认拉取最新的镜像) 如果你想指定版本可以这样 docker pull mongo:4.4&#…...
32.4 prometheus存储磁盘数据结构和存储参数
本节重点介绍 : prometheus存储磁盘数据结构介绍 indexchunkshead chunksTombstoneswal prometheus对block进行定时压实 compactprometheus 查看支持的存储参数 prometheus存储示意图 内存和disk之间的纽带 wal WAL目录中包含了多个连续编号的且大小为128M的文件,…...
两个生活中的例子反向理解正/反向代理?
正向代理 场景:你在学校里想访问一个被限制的网站,比如某个社交媒体平台。 操作方式: 你把访问请求发送给学校的代理服务器(正向代理)。代理服务器代表你向互联网发出请求,去访问那个受限的网站。网站的响…...
数据结构-线性表
数据结构-线性表 线性表的任意元素存放地址:Ai a1 L *(i-1) 当i0 则 Aia0L*i 少了一次计算 按照计算方法,当下标为0,可以少执行一次减法,这也是c数组下标取0的原因。 无论n多大都是一个固定时间称之为O(1) 时间复杂度 顺序表的运…...
Python酷库之旅-第三方库Pandas(245)
目录 一、用法精讲 1156、pandas.tseries.offsets.MonthEnd.is_month_start方法 1156-1、语法 1156-2、参数 1156-3、功能 1156-4、返回值 1156-5、说明 1156-6、用法 1156-6-1、数据准备 1156-6-2、代码示例 1156-6-3、结果输出 1157、pandas.tseries.offsets.Mon…...
贵阳思普信息技术有限公司 OA系统 apilogin 接口存在SQL注入漏洞风险
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
重学 Android 自定义 View 系列(九):侧边字母选择器
前言 本文来实现一个侧边字母选择器,很常见的一个控件,和上篇文章星星评分用到的关键技术点类似,难度不大,本篇再来温故知新一下。 最终效果如下: 1. 效果分析 每个字母被均匀分布在整个控件区域中;触摸…...
网络原理->DNS协议和NAT协议解
前言 大家好我是小帅,今天我们来了解应用层的DNS协议和NAT技术 个人主页:再无B~U~G 文章目录 1.重要应⽤层协议DNS(Domain Name System)1.1 DNS背景 2. NAT技术3. 总结 1.重要应⽤层协议DNS(Domain Name System) DNS是⼀整套从域…...
亚马逊开发视频人工智能模型,The Information 报道
根据《The Information》周三的报道,电子商务巨头亚马逊(AMZN)已开发出一种新的生成式人工智能(AI),不仅能处理文本,还能处理图片和视频,从而减少对人工智能初创公司Anthropic的依赖…...