【数据结构】ArrayList与LinkedList详解!!!——Java

目录

一🌞、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的实现类

在集合框架中,ArrayListLinkedList都实现了这个接口。 

二🌞、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的区别

不同点ArrayListLinkedList
数据结构逻辑上和物理上都是连续的在逻辑上连续,物理上不连续
随机访问

随机访问效率快,

时间复杂度为O(1)

随机访问效率慢,

时间复杂度为O(n)

插入或删除

效率慢,

时间复杂度为O(n)

效率快,

时间复杂度为O(1)

容量空间不够需要扩容没有容量限制
内存占用内存利用相对高效内存利用率低
应用场景元素访问+高效存储插入和删除频繁

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3&#xff08;10&#xff09; 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

微信版产品目录如何制作?

微信作为我国最流行的社交媒体平台&#xff0c;拥有庞大的用户群体。许多企业都希望通过微信来推广自己的产品&#xff0c;提高品牌知名度。制作一份精美、实用的微信版产品目录&#xff0c;是企业微信营销的重要手段。微信版产品目录的制作方法&#xff0c;帮助您轻松入门。 ​…

消息推送之SSE

一、简介 市面上很多系统都有 以上三种的消息提醒。但大多分为2类&#xff0c;一类移动端&#xff0c;一类web端比&#xff0c;通常在服务端会有若干张消息推送表&#xff0c;用来记录用户触发不同事件所推送不同类型的消息&#xff0c;前端主动查询&#xff08;拉&#x…

react中如何在一张图片上加一个灰色蒙层,并添加事件?

最终效果&#xff1a; 实现原理&#xff1a; 移动到图片上的时候&#xff0c;给img加一个伪类 &#xff01;&#xff01;此时就要地方要注意了&#xff0c;因为img标签是闭合的标签&#xff0c;无法直接添加 伪类&#xff08;::after&#xff09;&#xff0c;所以 我是在img外…

微搭低代码入门03函数

目录 1 函数的定义与调用2 参数与返回值3 默认参数4 将功能拆分成小函数5 函数表达式6 箭头函数7 低代码中的函数总结 在用低代码开发软件的时候&#xff0c;除了我们上两节介绍的变量、条件语句外&#xff0c;还有一个重要的概念叫函数。函数是执行特定功能的代码片段&#xf…

Zabbix中文监控指标数据乱码

1&#xff09;点击主机&#xff0c;选择Zabbix server 中的 图形 一项&#xff0c;可以看到当前显示的为乱码 2&#xff09; 下载字体文件&#xff1a; https://gitcode.com/open-source-toolkit/4a3db/blob/main/SimHei.zip 解压unzip -x SimHei.zip 3&#xff09; 替换字体文…

限价订单簿中的高频交易

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

JDBC事务管理、四大特征(ACID)、事务提交与回滚、MySQL事务管理

目录 一、什么是JDBC事务&#xff1f; &#xff08;1&#xff09;事务概念。 &#xff08;2&#xff09;JDBC事务的实现。 1、提交。 2、回滚。 &#xff08;3&#xff09;生活中可以类比 JDBC 事务的例子。 1、以网上购物为例。 二、JDBC的四大事务&#xff08;ACID&#xff0…

操作系统离散存储练习题

1. (简答题)分页存储管理系统具有快表&#xff0c;内存访问时间为2ns&#xff0c;检索快表时间为0.5ns&#xff0c;快表命中率为80%&#xff0c;求有效访问时间 -分析&#xff1a;首先访问缓存&#xff08;快表&#xff09;&#xff0c;如果没有找到访问内存&#xff08;页表&…

【AI日报】2024年11月13号

我回来啦&#xff01;&#xff01;发现自己好久不发文章了。 在某头部AI公众号实习的过程中&#xff0c;学到太多太多了&#xff0c;也感谢某位大神的指点&#xff0c;也衷心祝愿他的IP可以越做越好 之后因为时间关系&#xff0c;可能要自己出来单干了。 在实习过程中学到的…

inline内联函数(C++)

a&#xff09;⽤inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调⽤的地⽅展开内联函数&#xff0c;这样调⽤内联函数就不需要建⽴栈帧了&#xff0c;就可以提⾼效率。 b&#xff09;inline对于编译器⽽⾔只是⼀个建议&#xff0c;也就是说&#xff0c;你加了inl…

C++builder中的人工智能(27):如何将 GPT-3 API 集成到 C++ 中

人工智能软件和硬件技术正在迅速发展。我们每天都能看到新的进步。其中一个巨大的飞跃是我们拥有更多基于自然语言处理&#xff08;NLP&#xff09;和深度学习&#xff08;DL&#xff09;机制的逻辑性更强的AI聊天应用。有许多AI工具可以用来开发由C、C、Delphi、Python等编程语…

Harmony- List组件最后一个item显示不全

在使用List组件显示数据的时候会出现最后一个item显示不全的问题&#xff0c;如下 出现在高度问题上&#xff0c;如果List组件上下没有其他占位组件就是正常显示的 解决方案&#xff1a; 1.给List组件加上layoutWeight(1)&#xff0c;使它填满父控件剩余空间; 2.还有一种情况…

neo4j desktop基本入门

下载安装不在赘述&#xff0c;本文只记述一些neo4j的基本入门操作 连接本地neo4j数据库 1. 点击ADD添加连接 端口一般是7687 账户名和密码忘记了&#xff0c;可以通过neo4j web&#xff08;默认为neo4jneo4j://localhost:7687/neo4j - Neo4j Browser&#xff09;重置密码 AL…

function and task

任务和函数 在Verilog语言中提供了任务和函数&#xff0c;可以将较大的行为级设计划分为较小的代码段&#xff0c;允许设计者将需要在多个地方重复使用的相同代码提取出来&#xff0c;编写成任务和函数&#xff0c;这样可以使代码更加简洁和易懂。 1.1任务 任务的定义 任务定义…

24/11/13 算法笔记<强化学习> DQN算法

DQN算法的主要特点包括&#xff1a; 神经网络代替Q表&#xff1a;在传统的Q学习中&#xff0c;需要维护一个Q表来存储每个状态-动作对的Q值。而在DQN中&#xff0c;使用神经网络来近似这些Q值&#xff0c;这使得算法能够处理具有大量状态和动作的问题。 经验回放&#xff08;E…

blind-watermark - 水印绑定

文章目录 一、关于 blind-watermark安装 二、bash 中使用三、Python 调用1、基本使用2、attacks on Watermarked Image3、embed images4、embed array of bits 四、并发五、相关 Project 一、关于 blind-watermark Blind watermark 基于 DWT-DCT-SVD. github : https://githu…

Qt_day10_程序打包(完结)

目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的&#xff0c;用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包&#xff0c;用户直接下载并安装即可使用…

【C语言】指针的运算

指针的增量操作&#xff1a; int i 10; int *p &i;printf("p %p\n", p);//1024p; // 增加int 4个字节大小printf("p %p\n", p);//1028指针的增量运算取决于指针的数据类型&#xff0c;它将会增加数据类型的大小的字节。 指针的减量操作与增量同理…

C++builder中的人工智能(28):FANN: Fast Artificial Neural Networks快速人工神经网络(ANNs)

这篇文章全面介绍了快速人工神经网络&#xff08;ANNs&#xff09;的世界&#xff0c;探讨了它们在现代计算智能中的重要地位、核心特点、应用领域以及未来发展。 快速人工神经网络库&#xff08;Fast Artificial Neural Network Library&#xff0c;简称FANN&#xff09;是一…