【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 同…...
【日常记录-Git】如何为post-checkout脚本传递参数
1. 简介 在Git中,post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数,因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务,而不是作为一个通用的脚…...
《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
消除误解,课程资料逐步公开。 复习资料: Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷: 开卷考试,时间: 2024年11月16日 001 002 003 004 005 ……………………装………………………...
后台管理系统(开箱即用)
很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…...
5G CPE与4G CPE的主要区别有哪些
什么是CPE? CPE是Customer Premise Equipment(客户前置设备)的缩写,也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备,用于连接用户…...
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...
机器学习——期末复习 重点题归纳
第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...
MYSQL——数据更新
一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...
个人站长做哪些网站好/seo排名工具提升流量
WPF 基础系列2—WPF前世今生 1.开篇前言 很多时分了解一项新技术的汗青和趋势经常比这项技术的自身价值还要首要。WPF作为一项新技术(曾经三年多了,或者应该叫老技术了),大家都有需要了解它 的前因后果,特殊是公司的C…...
建设留学网站/产品网络营销方案
1、 1) 2) 3) 4) 2、 1) 2)AVL 3)B树 B树 3、哈希表 转载于:https://www.cnblogs.com/KennyRom/p/6222387.html...
雄安微网站开发/企业推广策略
一. kali安装ssh服务 1.修改源 1 rootDGG:~# vi /etc/apt/sources.list2 deb http://http.kali.org/kali kali-rolling main non-free contrib 2.更新一下源 apt-get update 3.下载ssh服务包 apt-get install ssh 4.打开ssh服务 1 service ssh start 打开ssh服务 2 service …...
网站运营暂停/seo技术建站
转载于:https://www.cnblogs.com/pubgoso/p/10759712.html...
做网站必备语言/seo培训优化课程
MC命令:help首先讲解最基础的指令/help,它可以让你查看许多命令的语法。当你没有使用一些命令的权限时,在/help里是不会显示的:/give/give指令可以让你获得许多物品,也可以给予别人物品。即使是在创造模式也会有一些东…...
网页的制作教案/手机seo快速排名
本文我们就来探索一下 Docker 的神秘世界,从零到一掌握 Docker 的基本原理与实践操作。别再守着前端那一亩三分地,是时候该开疆扩土了。 讲个故事 为了更好的理解 Docker 是什么,我们先来讲个故事: 我需要盖一个房子,于…...