【Java】ArrayList与LinkedList详解!!!
目录
一🌞、List
1🍅.什么是List?
2🍅.List中的常用方法
二🌞、ArrayList
1🍍.什么是ArrayList?
2🍍.ArrayList的实例化
3🍍.ArrayList的使用
4🍍.ArrayList的遍历
5🍍.ArrayList特点
6🍍.ArrayList优缺点
1.🍋ArrayList的优点:
2.🍋ArrayList的缺点:
三🌞、LinkedList
1🍰.什么是LinkedList?
2🍰.LinkedList的实例化
3🍰.LinkedList的使用
4🍰.LinkedList的遍历
5🍰.ListedList的特点
6🍰.LinkedList优缺点
1🍐.LinkedList优点:
2🍐.LinkedList缺点:
四🌞、ArrayList与LinkedList的区别
一🌞、List
1🍅.什么是List?
在集合框架中,List就是一个接口,继承于Collection接口。
在数据结构的角度,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作。
什么是线性表?
线性表是由n个具有相同类型元素组成的有限序列。线性表是一种常见的数据结构。在逻辑上,线性表是一种线性结构,就是连续的一条直线,在物理结构上,不一定是连续的,在物理存储是,通常是以数组和链式的结构形式存储。常见的线性比表有顺序表、链表、栈、队列.......
2🍅.List中的常用方法
增 | |
boolean add(E e) | 插入元素e在末尾 |
void add(int index,E element) | 插入元素e在index位置 |
boolean addAll(Collection?extends?E>c) | 尾插c中的元素 |
删 | |
E remove(int index) | 删除index位置的元素 |
boolean remove(Object o) | 删除第一次出现的o元素 |
void clear() | 清空 |
查 | |
E get(int index) | 获取index下标位置元素 |
int indexOf(Object o) | 获取第一个o元素所在的下标 |
int lastindexOf(Object o) | 获取最后一个o元素所在的下标 |
boolean contains(Object o) | 查看是否包含o元素 |
改 | |
E set(int index,E Element) | 将index下标的元素改为e |
截取 | |
List<E>subList(int formIndex,int toIndex) | 截取部分list |
List是一个接口,所以不能直接实例化。如果想要使用list接口,必须实例化list的实现类。
在集合框架中,ArrayList和LinkedList都实现了这个接口。
二🌞、ArrayList
1🍍.什么是ArrayList?
ArrayList是一个普通的类,是顺序表的一种,实现了list接口,是一种可动态调整大小的数组,能够储存不同类型的对象。
什么是顺序表?
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
2🍍.ArrayList的实例化
//接口的实例化:List<Integer> list1=new ArrayList<>();//ArrayList的实例化:ArrayList<Integer> list=new ArrayList<>();
两者区别:
- 接口的实例化:只能使用接口中定义类的方法;
- ArrayList实例化:可以使用ArrayList中独有的方法,更具有灵活性
3🍍.ArrayList的使用
ArrayList常见方法:
增: | |
void add(int data) | 在数组最后添加元素 |
void add(int pos,int data) | 在数组某下标插入元素 |
删: | |
void remove(int toRemove) | 删除第一次出现的元素 |
void clear(); | 清空所有元素 |
查: | |
boolean contains(int toFind) | 查看是否包含该元素 |
int get(int pos) | 获取该下标元素 |
int indexOf(int toFind ) | 获取该元素下标 |
改: | |
void set(int pos,int value) | 将下标元素进行更改 |
ArrayList方法的使用:
public static void main(String[] args) {List<Integer> list1=new ArrayList<>();//增://add:尾插list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);System.out.println(list1);//[1, 2, 3, 4, 5]//add:任意位置插入list1.add(3,100);System.out.println(list1);//[1, 2, 3, 100, 4, 5]//查://contains:是否包含该元素System.out.println(list1.contains(11));//false//get:获取下标元素int ret=list1.get(3);System.out.println(ret);//100//indexOf:获取元素下标int ret2=list1.indexOf(4);System.out.println(ret2);//4//改//set:将某下标的元素进行更改list1.set(1,13);System.out.println(list1);//[1, 13, 3, 100, 4, 5]//删:// remove:删除第一次出现的元素list1.remove(2);list1.remove(3);//list1.remove(6);//超出范围,报错System.out.println(list1);//[1, 13, 100, 5]//清空list1.clear();System.out.println(list1);//无//大小的获取:System.out.println(list1.size());}
4🍍.ArrayList的遍历
ArrayList的遍历可以使用三种方法:for循环、foreach、使用迭代器
示例:
public static void main(String[] args) {List<Integer> list1=new ArrayList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);}
for循环:
//for循环语句://list1.size():list1长度for (int i = 0; i < list1.size(); i++) {//get(i):获取i下标的元素System.out.print(list1.get(i)+" ");//1 2 3 4 5 }
foreach语句:
//foreach://每次循环时,取出list中的一个元素,将该元素赋值给变量num中for (Integer num:list1) {System.out.print(num+" ");//1 2 3 4 5}
迭代器:Iterator和ListIterator
//迭代器://从前往后打印// IteratorSystem.out.println("=====Iterator=====");Iterator<Integer> a=list1.iterator();//a.hasNext():用于判断集合a中是否还有下一个元素,如果有返回true,没有返回falsewhile(a.hasNext()){//a.next:返回迭代器当前所指向的元素,然后指向下一个元素未被遍历的元素并打印System.out.print(a.next()+" ");}System.out.println();//listIteratorSystem.out.println("=====listIterator=====");ListIterator<Integer> b=list1.listIterator();while(b.hasNext()){System.out.print(b.next()+" ");//1 2 3 4 5 }System.out.println();System.out.println("=====listIterator=====");//从后往前打印ListIterator<Integer> c=list1.listIterator(list1.size());//b.hasPrevious():用于判断集合a中是否有上一个元素,如果有返回true,没有返回falsewhile(b.hasPrevious()){//b.previous:返回迭代器当前所指向的元素,然后指向上一个元素未被遍历的元素并打印System.out.print(b.previous()+" ");//5 4 3 2 1 }
- ArrayList适合使用for循环语句遍历;
Iterator和Listiterator的区别:
- Iterator是Java中的一个接口,通过hasNext()和next()方法实现顺序遍历;
- Listiterator是Iterator的子接口,除了拥有Iterator的方法外,还有其他功能,所以其还有双向遍历的功能,通过hasPrevious()和previous()来实现反向遍历。
5🍍.ArrayList特点
- 动态数组结构:基于数组实现。可以像普通数组一样快速访问元素;
- 动态调整大小:与普通数组不同,当添加的元素个数大于ArrayList容量,ArrayList会自动扩容1.5倍;
- 元素储存有序:元素按照先后添加的顺序在排序中,在插入或者删除元素的时候,会相应改变元素位置;
- 允许元素重复:可以添加多个重复相同的元素;
- 通用性好:可以储存各类对象。
6🍍.ArrayList优缺点
1.🍋ArrayList的优点:
- 快速访问元素:基于数组实现,可以快速访问元素,时间复杂度为O(1);
- 内存利用相对高效:内存布局相对规整,主要是数组占用空间和少量额外空间用于记录数组大小等信息。在不用频繁的插入和删除中间元素的情况下,内存利用高效;
- 支持随机访问:可以随机访问任意位置的元素,在很多算法和操作中非常有用,如二分查找。
2.🍋ArrayList的缺点:
- 扩容开销:当元素数量大于数组容量的时候,会进行扩容。在扩容时会创建一个新的容量更大的数组并复制旧元素,这会消耗较多的时间和资源;
- 插入和删除的效率较低(中间元素):在频繁的插入和删除中间元素的时候,需要不断地移动元素,时间复杂度为O(n)。
由于ArrayList不适合进行频繁的插入和删除元素,所以在Java集合中引入了LinkedList,即链表结构。
三🌞、LinkedList
1🍰.什么是LinkedList?
LinkedList的底层是双向链表结构,是链表的一种。
什么是链表?
链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据域和指针域。链表逻辑顺序是连续的,在物理存储结构是非连续的。
链表的分类:
有头链表或者无头链表:
- 有头链表:有一个的头节点,其指针指向第一个数据节点;
- 无头链表:没有专门的头节点,第一个节点直接存储数据;
以下分类都有分为是否是有头链表还是无头链表:
- 单链表:每个节点包含数据和下一个接节点的指针,最后一个节点的指针指向空
- 双链表:每个节点都有包含数据,以及指向前一个节点的指针和指向后一个节点的指针
- 循环链表:循环链表分为单循环链表和双循环链表,其就是最后一个节点的下一个节点的指针指向其头结点。
2🍰.LinkedList的实例化
LinkedList<Integer> list1=new LinkedList<>();
3🍰.LinkedList的使用
其常用方法与ArrayList相差不大
public static void main(String[] args) {LinkedList<Integer> list1=new LinkedList<>();//增://add:尾插list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);System.out.println(list1);//[1, 2, 3, 4, 5]//add:任意位置插入list1.add(3,100);System.out.println(list1);//[1, 2, 3, 100, 4, 5]//查://contains:是否包含该元素System.out.println(list1.contains(11));//false//get:获取下标元素int ret=list1.get(3);System.out.println(ret);//100//indexOf:获取元素下标int ret2=list1.indexOf(4);System.out.println(ret2);//4//改//set:将某下标的元素进行更改list1.set(1,13);System.out.println(list1);//[1, 13, 3, 100, 4, 5]//删:// remove:删除第一次出现的元素list1.remove(2);list1.remove(3);//list1.remove(6);//超出范围,报错System.out.println(list1);//[1, 13, 100, 5]//清空list1.clear();System.out.println(list1);//无//大小的获取:System.out.println(list1.size());//0}
4🍰.LinkedList的遍历
遍历的三种方式:for循环,foreach、迭代器
public static void main(String[] args) {LinkedList<Integer> list1=new LinkedList<>();list1.add(1);list1.add(2);list1.add(3);list1.add(4);list1.add(5);//for循环语句:for (int i = 0; i < list1.size(); i++) {int ret=list1.get(i);System.out.print(ret+" ");//1 2 3 4 5}System.out.println();//foreachfor (Integer x:list1) {System.out.print(x+" ");//1 2 3 4 5}System.out.println();//迭代器:Iterator<Integer> a=list1.iterator();while (a.hasNext()){System.out.print(a.next()+" ");//1 2 3 4 5}System.out.println();ListIterator b=list1.listIterator();while (b.hasNext()){System.out.print(b.next()+" ");//1 2 3 4 5 }System.out.println();ListIterator c=list1.listIterator(list1.size());while(c.hasPrevious()){System.out.print(c.previous()+" ");//5 4 3 2 1}}
- LinkedList适合使用迭代器遍历;
5🍰.ListedList的特点
- 动态性:没有固定的大小限制,大小可动态变化;
- 插入或删除高效:在插入和删除时,只需修改相关节点即可,时间复杂度为O(1);
- 顺序访问:只能顺序访问节点,效率较低,时间复杂度为O(n);
- 存储结构:由一系列节点组成,每个节点包含数据域和指针域;
- 通用性:可以存储不同数据。
6🍰.LinkedList优缺点
1🍐.LinkedList优点:
- 动态性强:节点分散存储,不受连续空间的限制;
- 插入或删除高效:在插入和删除时,只需修改相关节点即可,时间复杂度为O(1);
- 可扩性好:可方便的增加和减少节点的数量;
2🍐.LinkedList缺点:
- 随机访问效率低:只能顺序访问节点,效率较低,时间复杂度为O(n);
- 额外空间开销大:除了存储数据本身,每个节点还要存储额外的指针信息,内存利用率低;
- 数据存储不连续:不利于有效存储,导致数据访问慢;
四🌞、ArrayList与LinkedList的区别
不同点 | ArrayList | LinkedList |
数据结构 | 逻辑上和物理上都是连续的 | 在逻辑上连续,物理上不连续 |
随机访问 | 随机访问效率快, 时间复杂度为O(1) | 随机访问效率慢, 时间复杂度为O(n) |
插入或删除 | 效率慢, 时间复杂度为O(n) | 效率快, 时间复杂度为O(1) |
容量 | 空间不够需要扩容 | 没有容量限制 |
内存占用 | 内存利用相对高效 | 内存利用率低 |
应用场景 | 元素访问+高效存储 | 插入和删除频繁 |
相关文章:

【Java】ArrayList与LinkedList详解!!!
目录 一🌞、List 1🍅.什么是List? 2🍅.List中的常用方法 二🌞、ArrayList 1🍍.什么是ArrayList? 2🍍.ArrayList的实例化 3🍍.ArrayList的使用 4🍍.ArrayList的遍…...
怎么用VIM查看UVM源码
利用ctags工具可以建立源码的索引表,在使用VIM或其他文本编辑器时,就可以跳转查看所调用的UVM或VIP的funtcion/task/class等源码了。 首先需要确认ctags安装,一般安装VIM后都有,如果没有可以手动安装。在VIM中可以输入:help ctag…...

数据结构C语言描述3(图文结合)--双链表、循环链表、约瑟夫环问题
前言 这个专栏将会用纯C实现常用的数据结构和简单的算法;有C基础即可跟着学习,代码均可运行;准备考研的也可跟着写,个人感觉,如果时间充裕,手写一遍比看书、刷题管用很多,这也是本人采用纯C语言…...
第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令
文章目录 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令TCP 设备的 READ 命令READ 修改 $ZA 和 $ZB$ZA 和 READ 命令 第二十五章 TCP 客户端 服务器通信 - TCP 设备的 READ 命令 TCP 设备的 READ 命令 从服务器或客户端发出 READ 命令以读取客户端或服务器设置的…...

【C++】哈希表的实现详解
哈希表的实现详解 一、哈希常识1.1、哈希概念1.2、哈希冲突1.3、哈希函数(直接定执 除留余数)1.4、哈希冲突解决闭散列(线性探测 二次探测)开散列 二、闭散列哈希表的模拟实现2.1、框架2.2、哈希节点状态的类2.3、哈希表的扩容2…...

高阶C语言之五:(数据)文件
目录 文件名 文件类型 文件指针 文件的打开和关闭 文件打开模式 文件操作函数(顺序) 0、“流” 1、字符输出函数fputc 2、字符输入函数fgetc 3、字符串输出函数fputs 4、 字符串输入函数fgets 5、格式化输入函数fscanf 6、格式化输出函数fpr…...

服务器上部署并启动 Go 语言框架 **GoZero** 的项目
要在服务器上部署并启动 Go 语言框架 **GoZero** 的项目,下面是一步步的操作指南: ### 1. 安装 Go 语言环境 首先,确保你的服务器上已安装 Go 语言。如果还没有安装,可以通过以下步骤进行安装: #### 1.1 安装 Go 语…...

【Java SE 】继承 与 多态 详解
🔥博客主页🔥:【 坊钰_CSDN博客 】 欢迎各位点赞👍评论✍收藏⭐ 目录 1. 继承 1.1 继承的原因 1.2 继承的概念 1.3 继承的语法 2. 子类访问父类 2.1 子类访问父类成员变量 2.1.1 子类与父类不存在同名成员变量 2.1.2 子类…...

【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法
【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法 目录 文章目录 【大语言模型】ACL2024论文-16 基于地图制图的罗马尼亚自然语言推理语料库的新型课程学习方法目录摘要:研究背景:问题与挑战:如何解…...
秋招大概到此结束了
1、背景 学院本,软工,秋招只有同程,快手和网易面试,后两家kpi(因为面试就很水),秋招情况:哈啰(实习转正ing),同程测开offer。 2、走测开的原因 很…...
华为OD机试真题---字符串化繁为简
华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析: 一、题目描述 给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、)࿰…...

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…...
初识Arkts
创建对象: 类: 类声明引入一个新类型,并定义其字段、方法和构造函数。 定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例 在以下示例中,定义了Person类,该类具有字段name和surname、构造函…...

基本的SELECT语句
1.SQL概述 SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。它是一种标准化的语言,用于执行各种数据库操作,包括创建、查询、插入、更新和删除数据等。 SQL语言具有简单、易学、高效的特点,…...

51c自动驾驶~合集30
我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 …...
Python Tutor网站调试利器
概述 本文主要是推荐一个网站:Python Tutor. 网站首页写道: Online Compiler, Visual Debugger, and AI Tutor for Python, Java, C, C++, and JavaScript Python Tutor helps you do programming homework assignments in Python, Java, C, C++, and JavaScript. It contai…...
h5小游戏实现获取本机图片
h5小游戏实现获取本机图片 本文使用cocos引擎 1.1 需求 用户通过文件选择框选择图片。将图片内容转换为Cocos Creator的纹理 (cc.Texture2D),将纹理设置到 cc.SpriteFrame 并显示到节点中。 1.2 实现步骤 创建文件输入框用于获取文件 let input document.createElement(&quo…...
前端 javascript a++和++a的区别
前端 javascript a和a的区别 a 是先执行表达式后再自增,执行表达式时使用的是a的原值。a是先自增再执行表达示,执行表达式时使用的是自增后的a。 var a0 console.log(a); // 输出0 console.log(a); // 输出1var a0 console.log(a); // 输出1 console.l…...

OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况: 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。” 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚…...

ctfshow-web入门-SSRF(web351-web360)
目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数,很典型的 SSRF 尝试使用 file 协议读文件: urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...