一文彻底搞懂Java中ArrayList和LinkedList 区别

文章目录

      • 1、数据结构
      • 2、插入和删除
      • 3、随机访问
      • 4、内存占用
      • 5、适用场景
      • 6、总结
      • 7、选择建议
      • 8、关于 ArrayList 和 LinkedList 的常见问题

1、数据结构

  • ArrayList:基于数组实现,元素在内存中是连续存储的。
  • LinkedList:基于链表实现,元素在内存中是非连续存储的,每个元素存储了指向其前一个和后一个元素的指针。

2、插入和删除

ArrayList:

  • 插入操作:需要将要插入元素后面的所有元素向后移动一位,时间复杂度为 O(n)。
  • 删除操作:需要将要删除元素后面的所有元素向前移动一位,时间复杂度为 O(n)。

LinkedList:

  • 插入操作:只需修改要插入元素的前后两个元素的指针,时间复杂度为 O(1)。
  • 删除操作:只需修改要删除元素的前后两个元素的指针,时间复杂度为 O(1)。

3、随机访问

  • ArrayList: 可以通过索引直接获取元素,时间复杂度为 O(1)。
  • LinkedList: 需要从头或尾部遍历链表找到指定元素,时间复杂度为 O(n)。

4、内存占用

ArrayList: 由于需要预留空间,所以内存占用较高。
LinkedList: 由于不需要预留空间,所以内存占用较低。

5、适用场景

ArrayList:

  • 适用于需要频繁进行随机访问或修改操作,而对插入和删除操作要求不高的场景。
  • 例如:存储用户列表、缓存数据等。

LinkedList:

  • 适用于需要频繁进行插入和删除操作,而对随机访问要求不高的场景。
  • 例如:实现栈、队列等数据结构。

6、总结

特性ArrayListLinkedList
数据结构数组链表
插入和删除O(n)O(1)
随机访问O(1)O(n)
内存占用较高较低
适用场景随机访问或修改插入和删除

7、选择建议

在实际开发中,可以根据具体的需求选择合适的集合类。

  • 如果需要频繁进行随机访问或修改操作,而对插入和删除操作要求不高,则可以选择 ArrayList。
  • 如果需要频繁进行插入和删除操作,而对随机访问要求不高,则可以选择 LinkedList。
  • 如果需要同时频繁进行插入、删除和随机访问操作,可以根据实际性能需求做出选择,或者考虑其他数据结构如 HashSet。

额外说明

Java 9 中引入了新的集合类 List.of(),可以创建不可变的 ArrayList。
Java 10 中引入了新的集合类 Vector,它是线程安全的 ArrayList。

8、关于 ArrayList 和 LinkedList 的常见问题

1. ArrayList 和 LinkedList 谁的性能更好?

总体而言,ArrayList 的随机访问性能优于 LinkedList,而 LinkedList 的插入和删除性能优于 ArrayList。

2. 什么情况下应该使用 ArrayList?

需要频繁进行随机访问或修改操作
元素数量相对较少
对插入和删除操作的频率要求不高

3. 什么情况下应该使用 LinkedList?

需要频繁进行插入和删除操作
元素数量相对较多
对随机访问操作的频率要求不高

4. 如何选择合适的集合类?

在选择集合类时,需要考虑以下因素:

对数据结构的操作类型
数据的访问模式
性能要求
内存占用

5. 除了 ArrayList 和 LinkedList 之外,还有哪些集合类?

Java 中提供了丰富的集合类,包括:

  • List: 有序集合,允许重复元素
  • Set: 无序集合,不允许重复元素
  • Map: 键值对映射
  • Queue: 先进先出 (FIFO) 队列
  • Stack: 后进先出 (LIFO) 栈

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

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

相关文章

第二证券:苹果Vision Pro出货在即 固态电池产业化前景渐明

sion Pro即将于2月2日正式在美国商场开始交给,苹果美国官网释出了Vision Pro的详细参数,与发布会介绍根本一致,依靠总计12个摄像头、5种传感器、职业顶尖的单眼4K分辨率Micro-OLED显示屏、M2与R1芯片,完成了当时商场上独一无二的沉…

有关使用Lombok@Builder注解构建对象返回为空

目录 问题 原因 解决方案 问题 使用lombokBuilder注解构建对象返回结果为空 原因 Builder注解底层调用setter等方法赋值,你如果没加Data注解就赋值不上,idea也不会错误警示,运行也不会抛出异常,这个平时不注意漏掉这个点还真…

SpanDB: A Fast, Cost-Effective LSM-tree Based KV Store on Hybrid Storage——论文泛读

FAST 2021 Paper 论文阅读笔记整理 问题 键值(KV)存储支持许多关键的应用和服务。它们在内存中执行快速处理,但通常受到I/O性能的限制。最近出现的高速NVMe SSD推动了新KV系统设计,以利用其低延迟和高带宽。 挑战 当前基于LSM…

gorm+mysql查询/修改json列相关操作汇总

目录 具体操作 1,查询JSON段落指定key的值是否有等于value的 或 指定keyvalue的数据记录 2,查询JSON段落中price>19的记录 3,查询JSON段中key为k0的记录 4、JSON段落中提取指定键值对到指定结构 5,查询JSON数组是否包含…

ANN(MLP) 三种预测

目录 介绍: 一、Mlp for binary classification 数据: 模型: 预测: 二、Mlp for Multiclass Classification 数据: 模型: 预测: 三、MLP for Regression 数据: 模型&a…

中科大计网学习记录笔记(五):协议层次和服务模型

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

《最新出炉》系列入门篇-Python+Playwright自动化测试-10-标签页操作(tab)

1.简介 标签操作其实也是基于浏览器上下文(BrowserContext)进行操作的,而且宏哥在之前的BrowserContext也有提到过,但是有的童鞋或者小伙伴还是不清楚怎么操作,或者思路有点模糊,因此今天单独来对其进行讲…

苹果的ipad可能会缓存vue项目的数据或者pinia数据

如果你发现开发的vue项目在ipad上出现了异常,比如数据出现NaN的情况,或者computed计算属性没生效,或者pinia里面的数据没生效,可能就是ipad浏览器safari缓存了数据导致的,只需要清空safari里面缓存的数据就可以了&…

开始学习第三十天

最近天气有点不太好 都是雨雪 今天也就正式学了第一个月咯 希望以后接着加油 今天是小年 大家小年快乐呀 明天要去奶奶家 在那边就没办法学习了 等年三十之后回来接着学习!

RT-Thread线程管理(使用篇)

layout: post title: “RT-Thread线程管理” date: 2024-1-26 15:39:08 0800 tags: RT-Thread 线程管理(使用篇) 之后会做源码分析 线程是任务的载体,是RTT中最基本的调度单位。 线程执行时的运行环境称为上下文,具体来说就是各个变量和数据&#xff0c…

Kotlin-集成SpringBoot+MyBatis+代码生成器

目录 一、相关版本 二、Maven因引入相关依赖 三、SpringBoot配置文件 四、代码生成工具 五、实现用户服务模块案例 1、Controller 2、Service 3、Entity 4、Mapper 5、接口测试 一、相关版本 工具版本Idea2022.3.2Springboot2.7.12MyBatis3.5.3.1MySQL8.0.28JDK1.8 …

Python详细教程

一、Python简历 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。 Python 是一种解…

20240203进程间通信的7种方式

内核提供的原始通信方式有三种: ①无名管道:没有名字的管道,是一个特殊的文件,并且存储在内存上,不在文件系统中展示,无名管道打开后,会返回两个文件描述符,一个是读端,…

MySQL原理(五)事务

一、介绍: 1、介绍: 在计算机术语中,事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务是恢复和并发控制的基本单位。 2、事务的4大特性 原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性…

LaTeX表格:合并单元格、文字旋转90度并居中

在LaTeX表格中,如何使用\multirow合并单元格,并将单元格中的文字旋转九十度,并且居中呢? 首先引入graphicx、multirow和array包: \usepackage{graphicx} \usepackage{multirow} \usepackage{booktabs}然后定义一种新…

类银河恶魔城学习记录1-4 PlayerJumpState基本源代码 P31

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; u…

DoubleEnsemble:基于样本重加权和特征选择的金融数据分析方法

现代机器学习模型(如深度神经网络和梯度提升决策树)由于其提取复杂非线性模式的优越能力,在金融市场预测中越来越受欢迎。然而,由于金融数据集的信噪比非常低,并且是非平稳的,复杂的模型往往很容易过拟合。…

「递归算法」:Pow(x,n)

一、题目 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。 示例 1: 输入:x 2.00000, n 10 输出:1024.00000示例 2: 输入:x 2.10000, n 3 输出:9…

使用Arcgis对欧洲雷达高分辨率降水数据重投影

当前需要使用欧洲高分辨雷达降水数据,但是这个数据的投影问题非常头疼。实际的投影应该长这样(https://gist.github.com/kmuehlbauer/645e42a53b30752230c08c20a9c964f9?permalink_comment_id2954366https://gist.github.com/kmuehlbauer/645e42a53b307…

个人建站前端篇(三)环境变量配置

在项目根目录下新建.env.development和.env.production文件,里面配置环境变量 .env.development内容如下 # 页面标题 VITE_APP_TITLE 云风网 # 开发环境配置 VITE_APP_ENV development # 开发环境 VITE_APP_BASE_API /api # 是否启用代理 VITE_HTTP_PROXY tru…