【Java】Java 链表类详记

news2024/9/28 7:19:19

本文仅供学习参考!

相关文章链接:

https://www.runoob.com/java/java-linkedlist.html

https://www.developer.com/java/java-linkedlist-class/

https://www.w3schools.com/java/java_linkedlist.asp

Java 中链表的类型

从最基本的角度来说,链表的节点包含数据字段以及指向列表中下一个节点的“下一个”引用(链接):

image-20230626173334925

还有其他类型的链表,例如循环链表,它是一种单链表,其中最后一个节点和下一个字段指向序列中的第一个节点。它就像一个重复的 MP3 曲目列表:

image-20230626173518079

Java LinkedList 类使用双向链表来存储元素。双向链表的节点还包含一个“prev”链接字段,该字段指向序列中的前一个节点。这允许向前和向后遍历:

image-20230626173524127

有关 LinkedList 类的更多信息

LinkedList类与ArrayList共享许多功能。例如,两者都是Collection框架的一部分,并且驻留在java.util包中。然而,作为LinkedList数据结构的实现,元素并不存储在连续的位置,并且每个元素都是包含数据和地址组件的单独对象。LinkedList的另一个区别因素是它的元素称为节点。

如果程序员需要对元素/节点进行大量插入和删除,则 LinkedList比数组或ArrayList更好。缺点是无法直接访问节点;相反,Java 需要从头部开始,沿着链接到达我们希望访问的节点。这使得访问特定节点成为一个耗时的过程。

以下是需要记住的有关 Java LinkedList的一些更重要的功能:

  • LinkedList类可以包含重复的元素。

  • LinkedList类维护插入顺序。

  • LinkedList类是非同步的。

  • 如上所述,由于不需要进行换档,因此操作速度很快。

  • LinkedList类可以用作列表、堆栈或队列,因为

    LinkedList类实现了ListDeque接口。完整的类声明显示了为什么这是可能的:

    public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, Serializable
    

如何在 Java 中创建链表

在 Java 中创建链表有两种主要方法。第一种是使用无参构造函数:

LinkedList<Type> linkedList = new LinkedList<>();

这将创建一个空的LinkedList,然后开发人员可以将节点添加到其中:

import java.util.LinkedList;

public class Main
{
  public static void main(String[] args) {
  
    LinkedList<String> linkedNodes = new LinkedList<String>();
    
    for (int i=1; i<=5; i++) {
      linkedNodes.add("node"+i);
    }
    // 在指定索引处添加新项
    linkedNodes.add(1, "another node1");
    System.out.println(linkedNodes);
  }
}

另一种选择是使用接受 Collection 的构造函数:

LinkedList<Type> linkedList = new LinkedList<>();

下面是一个示例 Java 程序,它创建一个字符串数组,然后将其转换为List。由于Lists实现了Collections接口,我们可以将其传递给LinkedList构造函数:

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class Main {

  // 主驱动器方法
  public static void main(String[] args)
  {
    // 创建字符串数组
    String[] nodes = { "node1", "node2", "node3", "node4", "node5" };
    
    // 将数组转换为列表
    List<String> nodesList = Arrays.asList(nodes);
    
    // 创建LinkedList并在LinkedList构造函数中传递List
    LinkedList<String> linkedList = new LinkedList<>(nodesList);
    
    // 在LinkedList构造函数中传递List
    System.out.println(linkedList); //[node1, node2, node3, node4, node5]
  }
}

在 Java 中使用 LinkedList 的项目

LinkedList提供了几种允许程序员对LinkedList进行操作的方法,例如:

  • 添加元素 – add(item)add(index, item)
  • 访问元素 – get(index)
  • 更改元素 – set(index, item)
  • 删除元素 – remove(index)

下面是一些 Java 示例,演示了上述所有LinkedList方法的使用:

import java.util.LinkedList;

public class Main
{
  public static void main(String[] args) {
    LinkedList<String> guitars = new LinkedList<>();
    
    guitars.add("Fender");
    guitars.add("Gibson");
    guitars.add("Jackson");
    System.out.println(guitars);
    
    // 在第二个位置插入新项目
    guitars.add(1, "Washburn");
    System.out.println(guitars);
    
    // 将Jackson改为Charvel
    guitars.set(3, "Charvel");
    System.out.println(guitars);
    
    // 删除第一个元素
    guitars.remove(0);
    System.out.println(guitars);
  }
}

程序输出如下所示:

Java 链表

将 LinkedList 视为 Deque 和/或 Queue

由于LinkedList类还实现了QueueDeque接口,因此我们可以调用两者的方法。以下是一些常用的方法:

  • addFirst() – 将指定元素添加到链表的开头
  • addLast() – 将指定元素添加到链表末尾
  • getFirst() – 返回第一个元素
  • getLast() – 返回最后一个元素
  • removeFirst() – 删除第一个元素
  • removeLast() – 删除最后一个元素
  • peek() – 返回链表的第一个元素(头)
  • poll() – 返回并删除链表中的第一个元素
  • Offer() – 在链表末尾添加指定元素

如果您只对特定于一个接口(即ListQueueDeque )的方法感兴趣,那么您始终可以将LinkedList实例化为该接口!例如:

// 使用List创建链表
List<String> list = new LinkedList<>();

// 使用Queue创建链表
Queue<String> 队列 = new LinkedList<>();

// 使用 Deque 创建链表
Deque<String> deque = new LinkedList<>();

请记住,将LinkedList实例化为特定接口会限制对该接口提供的方法的访问。因此,在上面的示例中,Queue不能使用DequeList接口中的方法。

在下面的程序中,LinkList充当Queue,那么为什么不将其实例化为一个Queue 呢?

import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

public class Main
{
  public static void main(String[] args) {

    Queue<String> queue = new LinkedList<>();

    for (int i=1; i<=5; i++) {
      queue.add("node"+i);
    }
    
    System.out.println(queue);

    // 访问第一个元素
    String str1 = queue.peek();
    System.out.println("Accessed Element: " + str1);

    // 访问并移除第一个元素
    String str2 = queue.poll();
    System.out.println("Removed Element: " + str2);
    System.out.println("LinkedList after poll(): " + queue);

    // 在末尾添加元素
    queue.offer("node6");
    System.out.println("LinkedList after offer(): " + queue);
  }
}

正如您在下面的程序输出中看到的,只要我们将自己限制为Queue类的方法,一切都会正常工作:

Java 链表教程

End

Java的LinkedList类是一个双向链表,允许向前和向后遍历。当您需要执行大量元素插入和删除操作或者需要访问QueueDeque接口的方法时,它通常比数组或ArrayList更可取。

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

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

相关文章

EBO绘制矩形

数据&#xff1a; float vertices[] { 0.5f, 0.5f, 0.0f, // top right 0.5f, -0.5f, 0.0f, // bottom right -0.5f, -0.5f, 0.0f, // bottom left -0.5f, 0.5f, 0.0f // top left }; unsigned int indices[] { // note that we start from 0! 0, 1, 3, // first triangle 1,…

UE4自定义资产类型编辑器实现

在虚幻引擎中&#xff0c;资产是具有持久属性的对象&#xff0c;可以在编辑器中进行操作。 Unreal 附带多种资源类型&#xff0c;从 UStaticMesh 到 UMetasoundSources 等等。 自定义资源类型是实现专门对象的好方法&#xff0c;这些对象需要专门构建的编辑器来进行高效操作。 …

SpringBoot3 快速入门及原理分析

1. 环境要求 环境&工具版本SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0 2. SpringBoot是什么 SpringBoot 能帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用&#xff08;说明&#xff1a;SpringBoot底层是Spring&#xff09; SpringBoot 应用只需…

CentOS7安装使用Nginx

CentOS7安装使用Nginx CentOS7安装使用Nginx1.安装1.1下载1.2 检验服务器上是否有nginx1.3 解压安装1.4 验证 2.部署2.1基本知识2.1.1常用命令2.1.2配置文件 2.2 配置效果前端后端 CentOS7安装使用Nginx 本文使用的nginx版本为1.22.1 Nginx发布版本分为主线版本和稳定版本&…

如何解决多线程卡死问题?四招教你轻松应对!

多线程大家都用过&#xff0c;可以让一个程序同时执行多个任务&#xff0c;提高效率和性能&#xff0c;一个人干的慢&#xff0c;三个人干。但是&#xff0c;多线程也带来了一些问题和挑战&#xff0c;比如线程同步、线程安全、线程死锁等问题&#xff0c;三个人抢一碗米饭&…

操作系统OS(一)磁盘与文件系统

计算机存储 计算机只能看懂1和0组成的语言&#xff0c;所以计算机存储数据的大小就是存储了多少个1和0. 比特位bit&#xff08;位&#xff09; 是计算机世界中最小的存储单位&#xff0c;每个1或者0占据1bit&#xff0c;表示二进制位 字节byte 由8个二进制位构成&#xff0c;1…

OpenGL 几何着色器

1.效果展示 爆破物体。 2.简介 在顶点和片段着色器之间有一个可选的几何着色器&#xff0c;几何着色器的输入是一个图元&#xff08;如点或三角形&#xff09;的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换。然而&#xff0c;几何着色器最有趣的…

RabbitMQ 2023面试5题(四)

一、RabbitMQ有哪些作用 RabbitMQ是一个消息队列中间件&#xff0c;它的作用是利用高效可靠的消息传递机制进行与平台无关的数据交流&#xff0c;并基于数据通信来进行的分布式系统的集成&#xff0c;主要作用有以下方面&#xff1a; 实现应用程序之间的异步和解耦&#xff1a…

[Africa battleCTF 2023 prequal] CPR部分

非州的比赛&#xff0c;说是总体简单&#xff0c;但也有几个难题0解&#xff0c;估计依然是等不到WP。 这个界面还挺好&#xff0c;除了慢以外没大问题。 Rev SEYI 题目很简单&#xff0c;程序报病毒&#xff0c;win11上的defender关上不容易呀。我的电脑怎么就不能听我的呢…

【Java高级语法】(十八)Optional类:解锁Java的Optional魔法:消灭那些隐匿的空指针,还程序世界一个安稳!~

Java高级语法详解之Optional类 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 常用操作API3.2 案例3.3 使用技巧 4️⃣ 应用场景5️⃣ 实现原理&#x1f33e; 总结 1️⃣ 概念 Optional类是Java 8引入的新特性&#xff0c;旨在解决空值&#xff08;null&#xff09;的处理问题。它…

ProtoBuf介绍与使用

文章目录 1、ProtoBuf概述2、下载和安装3、简单使用 1、ProtoBuf概述 Protobuf&#xff08;Protocol Buffers&#xff09;是由Google开发的一种语言无关的数据序列化格式。它旨在将结构化数据&#xff08;如结构化消息或文档&#xff09;高效地序列化为紧凑的二进制表示&#…

python GUI工具之PyQt5模块,pyCharm 配置PyQt5可视化窗口

https://doc.qt.io/qt-5/qtwidgets-module.html https://doc.qt.io/qt-5/qt.html#AlignmentFlag-enum 一、简介 PyQt是Qt框架的Python语言实现&#xff0c;由Riverbank Computing开发&#xff0c;是最强大的GUI库之一。PyQt提供了一个设计良好的窗口控件集合&#xff0c;每一…

【跑实验06】os包的理解?如何提取图片的名称?如何遍历一个文件夹,提取里面的图像名称?如何提取图片名称中的特定部分?代码错误地方修改;

文章目录 一、os包的理解1.1 文件和目录操作1.2 进程管理1.3 环境变量1.4 路径操作 二、如何提取图片的名称&#xff1f;三、遍历一个文件夹&#xff0c;提取里面的图像名称四、如何提取图片名称中的特定部分&#xff1f;五、代码报错修改 一、os包的理解 os 是 Python 中的一…

大厂OKR管理法:公开透明是最大特点

大厂OKR管理法&#xff1a;公开透明是最大的特点 仔细想&#xff0c;这是一件破天荒的事情 企业内部大部分的任务“公开透明” 公开透明会减少巨大的沟通成本 每个人的关键任务几乎是全部公开 估计少数的财务、人事、公关方面的不会 趣讲大白话&#xff1a;公开透明损耗少 【趣…

【UE 从零开始制作坦克】12-制作全自动机枪炮塔

效果 步骤 1. 下载模型和材质&#xff08;链接&#xff1a;https://download.csdn.net/download/ChaoChao66666/87951079&#xff09; 2. 将下载好的文件夹拖入UE工程中 首先点击“重置为默认”&#xff0c;然后勾选“合并网格体”&#xff0c;最后点击“导入所有” 导入后资源…

YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性

💡该教程为属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 💡本篇文章为YOLOv5、YOLOv7独家原创改进:独家首发最新原创XIoU_NMS改进点,改进有效可以直接当做自己的原创改进点来写,提升网络模型性能、收敛速度和鲁棒性。 �…

【Java】Java数组链表类详记

本文仅供学习参考&#xff01; 相关文章地址&#xff1a; https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html https://www.w3schools.com/java/java_arraylist.asp https://www.runoob.com/java/java-arraylist.html Java ArrayList 基础知识 ArrayList是 …

SpringSecurity-尚硅谷

前置知识 掌握Spring框架掌握SpringBoot使用掌握JavaWEB技术 文章目录 前置知识1. 简介1.1 概要1.2 历史 2.入门案例2.1 创建一个项目2.1.1 pom.xml2.1.2 controller层 2.2 运行这个项目2.32.4 SpringSecurity 基本原理2.5 UserDetailsService 接口讲解2.6 PasswordEncoder 接…

AI黑客松近期比赛清单;36氪AI淘宝店盈利复盘;GitHub Copilot官方最佳实践;AI在HR领域的应用探索 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; ⋙ 点击查看 AI Hackathon (黑客马拉松) 汇总清单 &#x1f916; 〖飞桨〗2023大模型应用创新挑战赛 百度飞桨联合上海市青年五十人创新创业研究院等…

【软件测试】推荐几款适合练手的项目

最近收到许多自学自动化测试的小伙伴私信&#xff0c;学习了理论知识后&#xff0c;却没有合适的练手项目。 测试本身是一个技术岗位&#xff0c;如果只知道理论&#xff0c;没有实战经验&#xff0c;在面试中很难说服面试官&#xff0c;比如什么场景下需要添加显示等待&#x…