Java中的LinkedList(链表)(如果想知道Java中有关LinkedList的知识点,那么只看这一篇就足够了!)

        前言:在Java编程语言中,Java集合框架提供了一组丰富的数据结构,以满足各种应用需求。其中,LinkedList作为一种常用的数据结构,具有独特的优势和广泛的应用场景。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

先让我们看一下本文大致的讲解内容:

目录

1.LinkedList的初识

2.LinkedList的创建

3.LinkedList中的常见API

(1)添加元素

(2)删除元素

(3)修改元素

(4)获取元素

4.LinkedList的遍历

(1)使用 for 循环

(2)使用增强型 for 循环

(3)使用 Iterator

(4)使用 ListIterator

(5)直接打印

5.LinkedList与ArrayList的区别


1.LinkedList的初识

        在开始学习LinkedList之前,让我们先了解一下什么是LinkedList:

        LinkedList(双向链表)是一种基于链表实现的线性数据结构,与ArrayList(顺序表)等基于数组实现的结构不同,它通过节点的引用来管理元素的存储和连接。

        其中每个节点包含三个主要部分:数据部分、指向下一个节点的指针(next)和指向前一个节点的指针(prev)。

下图很好的展示了什么是通过节点的引用来管理元素的存储和连接以及双向链表的构成:

       —— 通过上边的解释,我相信读者你已经对LinkedList(双向链表)有了自己的初步认知,那么接下来我们从LinkedList在整个集合框架中与其他类与接口的关系来继续介绍LinkedList(双向链表)

LinkedList与其他类与接口的关系:

从上图中我们可以了解到:

1.  LinkedList实现了List接口;
2.  LinkedList的底层使用了双向链表;
3.  LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问;

        通过上边的简单介绍,相信读者已经大致的了解了Java中的LinkedList,那么接下来让我们开始正式的来学习Java中的LinkedList(双向链表)吧。

2.LinkedList的创建

        在Java中创建LinkedList有两种方式:

方法解释
LinkedList()无参构造
public LinkedList(Collection<? extends E> c)使用其他集合容器中元素构造List

(1)让我们使用一个案例来看一下使用空参创建LinkedList的方式:

import java.util.LinkedList;public class LinkedListExample {public static void main(String[] args) {// 创建一个空的LinkedListLinkedList<String> linkedList = new LinkedList<>();// 添加一些元素到LinkedList中linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 输出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

(2)让我们使用一个案例来看一下使用使用其他集合容器中元素构造创建LinkedList的方式:

import java.util.LinkedList;
import java.util.ArrayList;public class LinkedListFromCollection {public static void main(String[] args) {// 创建一个ArrayList并添加一些元素ArrayList<String> arrayList = new ArrayList<>();arrayList.add("Element 1");arrayList.add("Element 2");arrayList.add("Element 3");// 使用ArrayList创建一个LinkedListLinkedList<String> linkedList = new LinkedList<>(arrayList);// 输出LinkedListSystem.out.println("LinkedList: " + linkedList);}
}

        ——这样我们就大致的了解了如何创建LinkedList了。

3.LinkedList中的常见API

        了解完如何创建一个LinkedList之后,让我们开始学习如何去操作所创建好的LinkedList。以下我们将会从增删查改四个方面来解释有关LinkedList的常用API。

(1)添加元素

  • add(E e): 在链表末尾添加元素。

  • add(int index, E element): 在指定位置插入元素。

  • addFirst(E e): 在链表头部添加元素。

  • addLast(E e): 在链表尾部添加元素。

接下来让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListAddExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();// 在末尾添加元素linkedList.add("Element 1");linkedList.add("Element 2");// 在指定位置插入元素linkedList.add(1, "Inserted Element");// 在头部添加元素linkedList.addFirst("First Element");// 在尾部添加元素linkedList.addLast("Last Element");//打印结果System.out.println("final: " + linkedList);}
}

(2)删除元素

  • remove(): 移除并返回链表的第一个元素。

  • remove(int index): 移除并返回指定位置的元素。

  • removeFirst(): 移除并返回链表的第一个元素。

  • removeLast(): 移除并返回链表的最后一个元素。

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListRemoveExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");System.out.println("Initial LinkedList: " + linkedList);// 移除并返回第一个元素String removedElement = linkedList.remove();System.out.println("Removed Element: " + removedElement);// 移除指定位置的元素String removedIndexElement = linkedList.remove(1);System.out.println("Removed Element at Index 1: " + removedIndexElement);// 移除第一个元素linkedList.addFirst("New First Element");String removedFirstElement = linkedList.removeFirst();System.out.println("Removed First Element: " + removedFirstElement);// 移除最后一个元素String removedLastElement = linkedList.removeLast();System.out.println("Removed Last Element: " + removedLastElement);//打印结果System.out.println("final: " + linkedList);}
}

(3)修改元素

  • set(int index , E element): 修改指定索引位置的元素。

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListSetExample {public static void main(String[] args) {// 创建一个LinkedList并添加一些元素LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");linkedList.add("Element 4");// 输出初始的LinkedListSystem.out.println("Initial LinkedList: " + linkedList);// 使用set方法替换索引为2的元素String oldElement = linkedList.set(2, "New Element");// 输出被替换的旧元素System.out.println("Replaced Element: " + oldElement);// 输出修改后的LinkedListSystem.out.println("final: " + linkedList);}
}

(4)获取元素

  • get(int index): 获取指定位置的元素。

  • getFirst(): 获取第一个元素。

  • getLast(): 获取最后一个元素。

  • indexof(): 获取指定对象的索引(从左到右第一个)

  • lastindexof(): 获取指定对象的索引(从右到左第一个)

  • contains(): 是否包含指定元素

让我们使用案例来帮助你进一步理解:

import java.util.LinkedList;public class LinkedListGetExample {public static void main(String[] args) {LinkedList<String> linkedList = new LinkedList<>();linkedList.add("Element 1");linkedList.add("Element 2");linkedList.add("Element 3");// 获取指定位置的元素String elementAtIndex = linkedList.get(1);System.out.println("Element at Index 1: " + elementAtIndex);// 获取第一个元素String firstElement = linkedList.getFirst();System.out.println("First Element: " + firstElement);// 获取最后一个元素String lastElement = linkedList.getLast();System.out.println("Last Element: " + lastElement);// 获取指定对象的索引(从左到右第一个)int index = linkedList.indexOf("Element 1");System.out.println(index);// 获取指定对象的索引(从右到左第一个)int lastindex = linkedList.lastIndexOf("Element 3");System.out.println(lastindex);// 是否包含指定元素boolean contains = linkedList.contains("Element 2");System.out.println(contains);}
}

通过上边的案例加上解释,相信读者已经了解了Java中LinkedList中的常用API该如何使用了。

4.LinkedList的遍历

        在Java中遍历LinkedList的方式有五种:分别是使用 for 循环、使用增强型 for 循环、使用 Iterator、使用 ListIterator、以及直接打印。

        ——接下来让我们一个一个来进行讲解:

(1)使用 for 循环

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 for 循环遍历 LinkedListfor (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}}
}

(2)使用增强型 for 循环

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用增强型 for 循环遍历 LinkedListfor (Integer element : list) {System.out.println(element);}}
}

(3)使用 Iterator

import java.util.LinkedList;
import java.util.Iterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 Iterator 遍历 LinkedListIterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

(4)使用 ListIterator

import java.util.LinkedList;
import java.util.ListIterator;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用 ListIterator 从前向后遍历 LinkedListListIterator<Integer> listIterator = list.listIterator();while (listIterator.hasNext()) {System.out.println(listIterator.next());}// 使用 ListIterator 从后向前遍历 LinkedListwhile (listIterator.hasPrevious()) {System.out.println(listIterator.previous());}}
}

(5)直接打印

import java.util.LinkedList;public class Main {public static void main(String[] args) {LinkedList<Integer> list = new LinkedList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 直接使用 System.out.println 打印 LinkedListSystem.out.println(list);}
}

——以上就是Java中遍历LinkedList的五种方式。

5.LinkedList与ArrayList的区别

        在学习完了LinkedList之后,有读者就会发问,LinkedList和之前的ArrayList有什么区别呢?以下为LinkedList与ArrayList的区别:

不同点ArrayListLinkedList
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持O(1)不支持:O(N)
头插需要搬移元素,效率低O(N)只需修改引用的指向,时间复杂度为O(1)
插入空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁

        以上就是LinkedList和之前的ArrayList的区别,读者要在合适的情况下选择合适的数据结构来进行操作。


以上就是本篇文章的全部内容了~~~

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

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

相关文章

linux radix-tree 基数树实现详解

radix tree&#xff0c;又称做基数树&#xff0c;是一种适合于构建key(index)与value(item)相关联的数据结构。内核中使用非常广泛。本文主要聚焦linux内核基数树的代码实现,大量注释过的代码。 radix-tree组织结构如下: 1、数据结构 /** The bottom two bits of the slot de…

IDEA阿里云OSS实现文件上传·解决苍穹外卖图片回显

简单交代配置阿里云OSS的思路 1. 首先去阿里云开通一个OSS服务&#xff0c;配置好一个自己的Bucket 2. 在IDEA配置Bucket 3. 拷贝官网的OSS工具类代码 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

电脑工具箱神器——uTools

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/ 很多人脑子里都有一些一个月只用两三次的软件&#xff0c;这些软件就这样积满了灰尘&#xff0c;需要的时候又不知道去哪里找。uTools 完美地解决…

MYSQL审批流程判断同一层级审批人是否全部通过审批

在做流程审批的时候&#xff0c;通常会出现某一层有多个审批人的情况&#xff0c;这个时候需要所有人都通过才会进入到下一步 数据结构如下图表格所示 每一个审批申请对应一个apply_id serial_no相同的代表是同一层级审批人 approval_status是审核状态 下面我们可以用一个SQL来…

Day50:单调栈 LeedCode 739. 每日温度 496.下一个更大元素 I 503. 下一个更大元素 II

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: 输…

【蓄势·致远】 同为科技(TOWE)2024年年中会议

2024年7月2日-8日&#xff0c;同为科技&#xff08;TOWE&#xff09;召开2024年年中工作会议。会议回顾上半年总体工作情况&#xff0c;分析研判发展形势&#xff0c;规划部署下半年工作。 为期一周的工作会议&#xff0c;由同为科技&#xff08;TOWE&#xff09;创始人、董事长…

深度|不同数据系统中的“一致性”(Consistency)含义的区别

“你们的系统能实现强一致性吗&#xff1f;”作为过去几年一直在开发流处理系统的从业者&#xff0c;我经常被问到这个问题。我时常想自信地推销我们的产品&#xff0c;但现实情况是&#xff0c;回答这个问题并不简单。其中的挑战并不在于问题本身&#xff0c;而在于 “一致性”…

字节8年经验之谈!好用移动APP自动化测试框架有哪些?

移动App自动化测试框架是为了提高测试效率、降低测试成本而开发的一套工具和方法。好用的移动App自动化测试框架有很多&#xff0c;下面将介绍一些常用的框架&#xff0c;并提供一篇超详细和规范的文章&#xff0c;从零开始帮助你搭建一个移动App自动化测试框架。 1. Appium&a…

十大优秀AI人工智能作词软件有哪些?

1、妙笔生词&#xff1a;国内专业智能作词工具&#xff0c;是一款非常优秀的国内作词软件&#xff0c;它可以选择语言&#xff0c;风格&#xff0c;韵脚一键生成歌词&#xff0c;也可以仿写歌词&#xff0c;可以续写歌词&#xff0c;可以智能取歌名&#xff0c;找优秀词句&…

神经网络识别数字图像案例

学习资料&#xff1a;从零设计并训练一个神经网络&#xff0c;你就能真正理解它了_哔哩哔哩_bilibili 这个视频讲得相当清楚。本文是学习笔记&#xff0c;不是原创&#xff0c;图都是从视频上截图的。 1. 神经网络 2. 案例说明 具体来说&#xff0c;设计一个三层的神经网络。…

如何找工作 校招 | 社招 | 秋招 | 春招 | 提前批

马上又秋招了&#xff0c;作者想起以前读书的时候&#xff0c;秋招踩了很多坑&#xff0c;但是第一份工作其实挺重要的。这里写一篇文章&#xff0c;分享一些校招社招的心得。 现在大学的情况是&#xff0c;管就业的人&#xff0c;大都是没有就业的辅导员&#xff08;笔者见过…

亿发512版本更新,看数据驾驶舱、扫码拣货、UDI序列号的新功能

如果您正寻求突破传统业务模式的束缚&#xff0c;希望拥抱数字化转型带来的无限可能&#xff0c;我们诚邀您体验亿发软件。亿发专业团队将为您提供个性化的咨询和定制服务&#xff0c;帮助您的企业快速适应市场变化&#xff0c;实现业务模式和商业模式的创新。

【腾讯云生成式AI产品解决方案深度分析 2024】

文末有福利&#xff01; 腾讯云生成式AI产品解决方案 (一) 基于生成式AI的腾讯云产品架构升级 (二) 腾讯云完善的产品矩阵&#xff0c;满足不同路线客户需求 1. 路线一 标准软件 (1) 腾讯乐享AI助手 落地背景及挑战在企业知识管理、培训学习、办公协同场景中&#xff0c;存…

初识C++ | 基本介绍、命名空间、输入输出、缺省函数、函数重载、引用、内联函数、nullptr

基本介绍 C的起源 1979年&#xff0c;当时的 Bjarne Stroustrup 正在⻉尔实验室从事计算机科学和软件⼯程的研究⼯作。⾯对项⽬中复杂的软件开 发任务&#xff0c;特别是模拟和操作系统的开发⼯作&#xff0c;他感受到了现有语⾔&#xff08;如C语⾔&#xff09;在表达能⼒、可…

无法定位程序输入点kernel32.dll ——一键修复丢失kernel32.dll方案

无法定位程序输入点" 错误通常发生在 Windows 操作系统中&#xff0c;当一个程序试图加载一个 DLL&#xff08;动态链接库&#xff09;文件中的特定函数&#xff0c;但无法找到该函数的入口点时。kernel32.dll 是 Windows 操作系统中的一个关键 DLL 文件&#xff0c;它包含…

设置DepthBufferBits和设置DepthStencilFormat的区别

1&#xff09;设置DepthBufferBits和设置DepthStencilFormat的区别 2&#xff09;Unity打包exe后&#xff0c;游戏内拉不起Steam的内购 3&#xff09;Unity 2022以上Profiler.FlushMemoryCounters耗时要怎么关掉 4&#xff09;用GoodSky资产包如何实现昼夜播发不同音乐功能 这是…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十八章 Linux编写第一个自己的命令

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Python-找客户软件

软件功能 请求代码&#xff1a; 填充表格&#xff1a; 可以search全国各个区县的所有企业信息&#xff0c;过滤手机号、查看是否续存/在业状态。方便找客户。 支持定-制-其他引-留-阮*件&#xff08;XHSS&#xff0c;DYY&#xff0c;KS&#xff0c;Bi-li*Bi-li&#xff09; V*…

AutoHotKey自动热键(八)脚本快速暂停与重新加载

我们在编辑脚本的时候,可以添加快捷键来改变脚本的状态 ;暂停脚本 F11::Suspend;重置脚本 F12::Reloadreload用来重置脚本 我们可以在脚本开头加上标签提示脚本重启成功 ToolTip, 脚本已经重启 Sleep, 1000 ToolTip第二个ToolTip是用来关闭提示器用的 这个提示功能一定要写…