Java基础之LinkedList

news/2024/11/26 23:17:41/

文章目录

    • 一、LinkedList介绍
    • 二、LinkedList特有方法 `LinkedList应知应会`
      • 2.1 调用addFirst() 方法在集合头部插入数据
      • 2.2 调用addLast() 方法在集合尾部追加数据
      • 2.3 调用getFirst() 方法获取集合第一个元素并返回元素值
      • 2.4 调用getLast() 方法获取集合最后一个元素并返回元素值
      • 2.5 调用removeFirst() 方法删除集合第一个元素并返回元素值
      • 2.6 调用removeLast() 方法删除集合最后一个元素并返回元素值
    • 三、LinkedList可重复特点
    • 四、LinkedList存取顺序一致
    • 五、LinkedList有带索引方法
      • 5.1 普通输出语句输出LinkedList集合
      • 5.2 普通for循环输出LinkedList集合
      • 5.3 forEach语句输出LinkedList集合
      • 5.4 Iterator迭代器输出LinkedList集合
    • 六、LinkedList删除指定值的数据
      • 6.1 删除指定值的数据(漏删数据问题) `常见问题`
      • 6.2 漏删数据解决办法

一、LinkedList介绍

LinkedList是List接口的一个实现类(LinkedList实现了List的接口),它具有List的特点。LinkedList的底层结构是链表。

在这里插入图片描述

LinkedList并没有其他特点,List的特点即为它的特点:

1、可重复:当存入相同数据时,可以有重复的数据存入,这是因为List集合有带索引的方法,可以通过索引值不同来辨别那些相同的数据。

2、存取顺序一致:存入数据的顺序与输出数据的顺序一定一致。

3、有带索引的方法:可以直接通过索引得到相应数据,可以直接使用普通for循环来遍历集合。

接下来我们将结合代码来具体学习LinkedList相关知识。

二、LinkedList特有方法 LinkedList应知应会

由于LinkedList是List接口和Collection接口的实现类,因此List和Collection所拥有的方法,LinkedList均可使用,在此不再详细讲述。

方法名说明
void addFirst(E e)在集合头部插入数据
void addLast(E e)在集合尾部追加数据
E getFirst()获取集合第一个元素并返回元素值
E getLast()获取集合最后一个元素并返回元素值
E removeFirst()删除集合第一个元素并返回元素值
E removeLast()删除集合最后一个元素并返回元素值

2.1 调用addFirst() 方法在集合头部插入数据

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用addFirst() 方法在集合头部插入数据linkedList.addFirst("aa");//普通方法输出集合System.out.println(linkedList);}

运行结果:
在这里插入图片描述


2.2 调用addLast() 方法在集合尾部追加数据

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用addLast() 方法在集合尾部追加数据linkedList.addLast("bb");//普通方法输出集合System.out.println(linkedList);}

运行结果:
在这里插入图片描述


2.3 调用getFirst() 方法获取集合第一个元素并返回元素值

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用getFirst() 方法获取集合第一个元素并返回元素值String first = linkedList.getFirst();System.out.println(first);}

运行结果:
在这里插入图片描述


2.4 调用getLast() 方法获取集合最后一个元素并返回元素值

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用getLast() 方法获取集合最后一个元素并返回元素值String last = linkedList.getLast();System.out.println(last);}

运行结果:
在这里插入图片描述


2.5 调用removeFirst() 方法删除集合第一个元素并返回元素值

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用removeFirst() 方法删除集合第一个元素并返回元素值String s = linkedList.removeFirst();System.out.println("被删除的第一个元素为:"+s);//普通输出System.out.println(linkedList);}

运行结果:
在这里插入图片描述


2.6 调用removeLast() 方法删除集合最后一个元素并返回元素值

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("b");linkedList.add("c");//调用removeLast() 方法删除集合最后一个元素并返回元素值String s = linkedList.removeLast();System.out.println("被删除的最后一个元素为:"+s);//普通输出System.out.println(linkedList);}

运行结果:
在这里插入图片描述


三、LinkedList可重复特点

我们添加三个a和三个c数据

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("a");linkedList.add("a");linkedList.add("a");linkedList.add("b");linkedList.add("c");linkedList.add("c");linkedList.add("c");//普通输出System.out.println(linkedList);}

运行结果:(我们看到重复的数据同样也会被输出
在这里插入图片描述


四、LinkedList存取顺序一致

我们存入数据的顺序是aoao,daidai,bobo,lisi,wangwu,zhangsan

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("aoao");linkedList.add("daidai");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");//普通输出System.out.println(linkedList);}

运行结果:
在这里插入图片描述


五、LinkedList有带索引方法

因为LinkedList有带索引的方法,因此可以直接通过索引得到相应数据,可以使用普通for循环,普通输出语句,forEach语句和Iterator迭代器来遍历集合。

5.1 普通输出语句输出LinkedList集合

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("aoao");linkedList.add("daidai");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");//普通输出System.out.println(linkedList);}

运行结果:
在这里插入图片描述


5.2 普通for循环输出LinkedList集合

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("aoao");linkedList.add("daidai");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");//普通for循环输出LinkedList集合for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i));}}

运行结果:
在这里插入图片描述


5.3 forEach语句输出LinkedList集合

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("aoao");linkedList.add("daidai");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");//forEach语句输出LinkedList集合//s即为list遍历的结果,String即为LinkedList的数据类型for (String s : linkedList) {System.out.println(s);}}

运行结果:
在这里插入图片描述


5.4 Iterator迭代器输出LinkedList集合

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("aoao");linkedList.add("daidai");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");//Iterator迭代器输出LinkedList集合Iterator<String> iterator=linkedList.iterator();//iterator.hasNext()的作用即为判断当前位置是否存在元素,若存在则返回true,否则返回falsewhile(iterator.hasNext()){//iterator.next()的作用即为获取当前位置元素,并指向下一位置以便hashNext判断System.out.println(iterator.next());}}

运行结果:
在这里插入图片描述


六、LinkedList删除指定值的数据

6.1 删除指定值的数据(漏删数据问题) 常见问题

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("daidai");linkedList.add("daidai");linkedList.add("aoao");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");linkedList.add("daidai");//LinkedList删除值为daidai的元素for (int i = 0; i < linkedList.size(); i++) {if(linkedList.get(i).equals("daidai")){linkedList.remove(i);}}//普通输出System.out.println(linkedList);}

运行结果:(我们发现仍然有一个daidai未被删除
在这里插入图片描述
原因:当我们删除某一元素后,之前此元素之后的所有数据会左移,那么如果第二个与此元素相等的元素,于此元素并排,它就会左移至此元素的位置,而我们的指针之后会加1,因此会跳过它。文字难以理解?没关系,上图解!!!

首先我们插入数据集合元素的顺序如下:
请添加图片描述


当我们删除第一个daidai之后,集合变为如下图:(我们不难得出结论当我们删除LinkedList集合中的某一数据时,集合会自动缩容。被删除的元素之后的元素会发生左移,即我们删除daidai之后之前索引为1值为daidai的元素左移后,变为索引为0值为daidai
请添加图片描述


但是此时我们的i索引指向的是1,因此在之后的遍历中会跳过一个daidai,发生漏删现象
请添加图片描述


6.2 漏删数据解决办法

当我们删除一个数据后,为了防止漏删,索引i也应跟着左移,即i-1

public static void main(String[] args) {//创建一个数据类型为String类型的LinkedList对象LinkedList<String> linkedList=new LinkedList<>();//调用add()方法增添数据linkedList.add("daidai");linkedList.add("daidai");linkedList.add("aoao");linkedList.add("bobo");linkedList.add("lisi");linkedList.add("wangwu");linkedList.add("zhangsan");linkedList.add("daidai");//LinkedList删除值为daidai的元素for (int i = 0; i < linkedList.size(); i++) {if(linkedList.get(i).equals("daidai")){linkedList.remove(i);//之所以i要减一,是因为当我们删除第一个daidai后,之前第一个daidai之后的所有数据会左移,那么第二个daidai就会左移至第一个daidai的位置,如果我们的i不减1,那么就会跳过第二个daidai而不删除它i=i-1;}}//普通输出System.out.println(linkedList);}

运行结果:
在这里插入图片描述


OK!!!LinkedList介绍结束!!!


http://www.ppmy.cn/news/39344.html

相关文章

4.JAVA基础面试题:重要知识

四.JAVA基础面试题&#xff1a;重要知识 1.为什么JAVA只有值传递 2.JAVA获取运行时类的四种方式 3.动态代理和静态代理的对比 4.unsafe是什么 5.泛型擦除机制出现的问题&#xff1f; 四.JAVA基础面试题&#xff1a;重要知识 1.为什么JAVA只有值传递 实参&#xff1a;传递…

Flutter常用插件和对.yaml讲解

目录 一、对Flutter项目中的pubspec.yaml 进行讲解&#xff1a; 二、Flutter 常用插件 1、时间选择器 2、toast 3、RxDart 类似RxJava 和RxSwift 4、本地存储、保存--和Android sp 一样 5、数据库 6、获取包信息 7、下拉刷新&#xff0c;加载更多 8、google推荐--状态…

瑞吉外卖Day8Linux环境部署

MySQL数据库管理系统安装部署【简单】 简介 MySQL数据库管理系统&#xff08;后续简称MySQL&#xff09;&#xff0c;是一款知名的数据库系统&#xff0c;其特点是&#xff1a;轻量、简单、功能丰富。 MySQL数据库可谓是软件行业的明星产品&#xff0c;无论是后端开发、大数…

python 读取视频有多少帧并将视频转为GIF动态图

目录 1 python读取视频帧 2 python 将MP4格式视频前500帧转为动态图 3 python 将MP4格式视频第2688到2890帧转为动态图&#xff0c;并将gif图片的七分之一列和后七分之一列裁掉 4 python 将MP4格式视频第2688到2890帧转为动态图&#xff0c;并将gif图片的七分之一行和后七分…

R-CNN(Region with CNN feature)

目录 1. 介绍 2. R-CNN 2.1 SS(Selective Search) 算法 生成候选框 2.2 CNN 提取特征 2.3 SVM 分类 非极大值抑制 2.4 回归器微调候选框 3. R-CNN 的缺点 1. 介绍 目标识别的发展历史如图 2. R-CNN RCNN 是两阶段目标检测的鼻祖&#xff0c;类似于深度学习开山之作Al…

Cartesi 2023 年 3 月回顾

2023 年 3 月 31 日 &#xff0c;欢迎新一批建设者加入Cartesi 社区。我们在三月初非常愉快地结束了ETH Denver&#xff0c;看到所有使用Cartesi技术建立的创新项目&#xff0c;让我们印象深刻&#xff0c;这些项目来自我们今年的第一次黑客马拉松&#xff01;想要了解更多关于…

Python 自动化指南(繁琐工作自动化)第二版:十二、网络爬取

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter12/ 在那些没有 Wi-Fi 的罕见、可怕的时刻&#xff0c;我意识到我在电脑上做的事情有多少是我在互联网上做的。出于纯粹的习惯&#xff0c;我会发现自己试图查看电子邮件&#xff0c;阅读朋友的 Twitter 信息&am…

Python 进阶指南(编程轻松进阶):五、发现代码异味

原文&#xff1a;http://inventwithpython.com/beyond/chapter5.html 导致程序崩溃的代码显然是错误的&#xff0c;但是崩溃并不是发现程序问题的唯一手段。其他迹象可能表明程序存在更微妙的错误或不可读的代码。就像气体的味道可以指示气体泄漏或者烟雾的味道可以指示火灾一样…