当前位置: 首页 > news >正文

Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。

LinkedList 是 Java 中的一个双向链表实现的类,它实现了 List 接口,同时也实现了 Deque 接口,因此可以用作列表、队列或双端队列。下面是关于 LinkedList 的基本介绍和细节讨论:

基本介绍:

  • LinkedList 是一个双向链表实现,每个节点包含了当前元素的值、指向前一个节点的引用和指向下一个节点的引用。

  • 它实现了 List 接口,因此具备了列表的功能,支持随机访问、添加、删除等操作。

  • 由于是链表实现,它在插入和删除元素时的性能通常比数组实现的 ArrayList 更好。

  • 它同时也实现了 Deque 接口,因此支持队列和双端队列的操作。

细节讨论:

  • LinkedList 允许元素为 null

  • 由于是链表结构,它在随机访问时的性能较差,需要遍历链表来找到对应索引的元素。

  • 插入和删除元素的性能较好,因为只需要改变节点的引用即可,而不需要像数组那样进行元素的移动。

  • LinkedList 内部使用双向链表结构,因此在插入和删除元素时不需要像 ArrayList 那样进行数组元素的移动。

  • LinkedList 不适合大量随机访问的场景,适合在插入和删除元素频繁的情况下使用。

  • LinkedList 在使用迭代器遍历时,性能可能会比 ArrayList 稍差,因为它需要在链表中移动节点。

  • LinkedList 的内存消耗会稍微大于 ArrayList,因为每个节点需要保存额外的前后节点的引用。

适用场景:

  • 当需要频繁地在列表的任意位置插入或删除元素时,可以考虑使用 LinkedList

  • 当需要实现队列或双端队列时,LinkedList 是一个不错的选择,因为它实现了 Deque 接口。

  • 不适合需要频繁随机访问元素的场景,因为它的随机访问性能较差。

总之,LinkedList 是一种适合特定场景的数据结构,特别适用于需要频繁插入和删除元素的情况。在选择使用时,应根据具体的应用场景和性能需求进行权衡。

双向列表的代码:

public class LinkListExpandCode {public static void main(String[] args) {Node ret1 = new Node("ret1");Node ret2 = new Node("ret2");Node ret3 = new Node("ret3");ret1.next = ret2;ret2.next = ret3;ret3.pre = ret2;ret2.pre = ret1;Node first = ret1;Node last = ret3;//从头遍历while (true){if(first == null){break;}System.out.println(first);first = first.next;}//从尾遍历while (true){if(last == null){break;}System.out.println(last);last = last.pre;}//插入对象Node ret = new Node("ret");ret.next = ret3;ret.pre = ret2;ret2.next = ret;ret3.pre = ret;//遍历//遍历之前先将first恢复原位,因为之前从头开始遍历的时候first到尾部了first = ret1;//first恢复原位//从头遍历while (true){if(first == null){break;}System.out.println(first);first = first.next;}//删除对象ret2.next = ret3;ret3.pre = ret2;//从头遍历first = ret1;//first恢复原位while (true){if(first == null){break;}System.out.println(first);first = first.next;}}
}class Node{//模拟双向列表private Object name;public Node pre;//注意这里的类型是Node类型,因为在main方法中pre和next要作为引用指向别的结点public Node next;public Node(Object name) {this.name = name;}@Overridepublic String toString() {return "Node{" +"name=" + name +'}';}
}

LinkList的源码:

public class LinkListCRUD {public static void main(String[] args) {/*** 源码(以增为例):第一步public LinkedList() {}第二步public boolean add(E e) {linkLast(e);return true;}第三步void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;modCount++;}//Node类private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}}** */LinkedList linkedList = new LinkedList();//增linkedList.add("ret1");linkedList.add("ret2");linkedList.add("ret3");System.out.println(linkedList);//删linkedList.remove("ret2");System.out.println(linkedList);//改linkedList.set(1,"ret2");System.out.println(linkedList);//查System.out.println(linkedList.contains("ret2"));System.out.println(linkedList.get(1));}
}

Java中LinkList和ArrayList的比较与选择:

LinkedListArrayList 都是 Java 中常用的集合类,它们分别基于链表和动态数组的数据结构实现,各有优劣。下面是它们的比较与选择的一些方面:

性能比较:

  • 随机访问:ArrayList 在随机访问时性能优于 LinkedList,因为 ArrayList 底层使用数组,可以通过索引直接访问元素,而 LinkedList 需要遍历链表才能访问指定索引的元素。

  • 插入和删除:LinkedList 在插入和删除元素时性能优于 ArrayList,因为链表插入和删除只需要改变节点的引用,而不需要移动元素。而 ArrayList 在插入和删除时需要移动元素来保持连续性。

内存消耗:

  • LinkedList 需要额外的空间存储前后节点的引用,因此内存消耗稍高于 ArrayList

  • ArrayList 需要预分配数组空间,当元素个数增加时可能需要进行扩容,扩容时需要重新分配数组并复制元素,可能会导致内存重新分配的开销。

迭代性能:

  • 在使用迭代器遍历集合时,ArrayList 的性能通常优于 LinkedList,因为 ArrayList 在数组中连续存储元素,迭代时可以更高效地访问。

适用场景:

  • 如果需要频繁进行随机访问操作,使用 ArrayList 更合适,例如需要根据索引获取元素或进行快速遍历。

  • 如果需要频繁进行插入和删除操作,特别是在中间位置进行插入和删除,使用 LinkedList 更合适,因为链表插入和删除操作性能更好。

综合考虑:

  • 如果对集合的操作类型不确定,或者需要在不同操作间取得平衡,可以根据实际场景进行选择。

  • 如果对性能要求不高,且操作类型多样,可以优先选择 ArrayList,因为它在大多数情况下都表现得很好。

  • 如果需要根据不同操作类型进行优化,也可以根据操作的频率和性质来选择使用 ArrayListLinkedList

综合来说,选择使用 ArrayList 还是 LinkedList 取决于具体的使用场景和操作类型。如果可能,可以根据实际需求进行性能测试和评估,以便选择最适合的集合类。

相关文章:

Java中LinkList的基本介绍和细节讨论。双向链表的代码和LinkList的源码。LinkList和ArrayList的比较与选择。

LinkedList 是 Java 中的一个双向链表实现的类&#xff0c;它实现了 List 接口&#xff0c;同时也实现了 Deque 接口&#xff0c;因此可以用作列表、队列或双端队列。下面是关于 LinkedList 的基本介绍和细节讨论&#xff1a; 基本介绍&#xff1a; LinkedList 是一个双向链表…...

Proteus软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Proteus软件是一款电路设计和仿真的综合性软件&#xff0c;由Labcenter公司开发。它提供了一个交互式的图形界面&#xff0c;用户可以在其中构建电路、仿真结果并实时观察仿真结果。 1、Proteus的历史和演变 Proteus软件最初于…...

“图为科技——什么是边缘计算“

边缘计算是一种新兴的计算模式&#xff0c;它将计算资源和服务推向离终端设备更近的地方。以往&#xff0c;计算任务大多集中在云端进行&#xff0c;但随着物联网和移动互联网的快速发展&#xff0c;边缘计算应运而生。 边缘计算的核心思想是将计算、存储和网络功能部署在离终端…...

SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)

在上一篇文章讲述zuul的时候&#xff0c;已经提到过&#xff0c;使用配置服务来保存各个服务的配置文件。它就是Spring Cloud Config。 一、简介 在分布式系统中&#xff0c;由于服务数量巨多&#xff0c;为了方便服务配置文件统一管理&#xff0c;实时更新&#xff0c;所以需…...

mysql 错误码

一、 #22001 Caused by: java.sql.BatchUpdateException: Data truncation: #22001检查一下数据库表字段&#xff0c;特别是VARCHAR的长度是否够。 Caused by: java.sql.BatchUpdateException: #HY000检查是不是违反了非空约束&#xff0c;NOT NULL字段有没有没传的 二、...

HTML的form表单标签详解~

通过HTML提交表单数据有web中是非常常用的操作&#xff0c;所以有必要详细、仔细学习了解HTML的form表单。 目录 01-关键词 novalidate 是什么意思&#xff1f;02- action"" 是什么意思&#xff1f;03- enctype"multipart/form-data" 是什么意思&#xff1…...

Kafka 消费者“group_name”组正在永远重新平衡

目录 一、场景1.1、场景应用环境1.2、 问题重现二、问题分析三、解决方案一、场景 1.1、场景应用环境 卡夫卡:2.11-1.0.1。主题:并发度为 5 且分区为 5 。1.2、 问题重现 当应用程序重新启动并且在分区分配之前在主题上发布消息时,主题的 5 个消费者找到组协调器并向组协调…...

高并发编程-3. Amdahl(阿姆达尔)定律与Gustafson定律

此文章为笔记&#xff0c;为阅读其他文章的感受、补充、记录、练习、汇总&#xff0c;非原创&#xff0c;感谢每个知识分享者。 前言 有关为什么要使用并行程序的问题前面已经进行了简单的探讨。总的来说&#xff0c;最重要的应该是处于两个目的。 第一&#xff0c;为了获得更…...

ffmpeg之常用的命令行参数

FFmpeg是一套可以用来转换数字音频、视频的开源代码工程&#xff0c;能够编译出SDK&#xff08;库&#xff09;和命令行工具。用户可以使用SDK开发程序实现音视频的操作&#xff0c;也可以使用命令行工具ffmpeg实现音视频的操作。 一、常用参数 -i inputfile 指定输入文件 -s…...

tomcat服务器

tomcat下载安装 1、认识tomcat服务器 tomcat用来管理web应用&#xff0c;叫应用服务器&#xff0c;tomcat本身也是java工程 为什么要使用tomcat 为了达到资源共享。 在静态web,俩种访问方式 一种是找到文件的磁盘路径&#xff0c;一种是直接点击右上角的浏览器图标 直接点击…...

【面试题】MVC、MVP与MVVM模式是什么?

MVC模式 MVC是应用最广泛的软件架构之一&#xff0c;一般MVC分为&#xff1a; Model&#xff08; 模型 &#xff09;、Controller&#xff08; 控制器 &#xff09;、View&#xff08; 视图 &#xff09;。 这主要是基于分层的目的&#xff0c;让彼此的职责分开。View 一般…...

网络安全02-C段扫描、开放端口

查询网站IP https://seo.chinaz.com/hetianlab.com 扫描指定IP&#xff1a;例&#xff1a;nmap -A -T4 ww.hetianlab.com -oX out.html 扫描指定段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.113.1-200 扫描整个C段&#xff1a;例&#xff1a;nmap -O -Pn -A 192.168.…...

vscode流程图插件使用

vscode流程图插件使用 1.在vscode中点击左下角设置然后选择扩展。 2.在扩展中搜索Draw.io Integration&#xff0c;安装上面第一个插件。 3.安装插件后在工程中创建一个后缀为drawio的文件并且双击打开即可绘制流程图...

mysql数据导入导出参数说明

一、使用into outfile和load data infile导入导出备份数据 这种方法的好处是导出的数据格式可以自己规定&#xff0c;并且导出的是纯数据&#xff0c;不含建表信息。 1.into outfile导出 SELECT * FROM metadatakeys INTO OUTFILE D:/outfile.txt FIELDS TERMINATED BY | E…...

Qt——QLineEdit控件常见的属性、方法和信号

QLineEdit控件常见的属性、方法和信号 一、QLineEdit控件常见属性和方法 二、QLineEdit控件常见信号 QLineEdit&#xff1a;单行文本输入框控件 一、QLineEdit控件常用属性和方法&#xff1a; 1. text&#xff1a; 描述&#xff1a;获取或设置文本框中的文本内容。 用法&…...

C语言:指针和数组(看完拿捏指针和数组)

目录 数组名的理解&#xff1a; 一维数组&#xff1a; 解析&#xff1a; 字符数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 字符串数组&#xff1a; 解析&#xff1a; 解析&#xff1a; 一级指针&#xff1a; 解析&#xff1a; 解析&#xff1a; 二维数组&a…...

Conda命令整理-自用版

Conda用法整理-自用版 Conda介绍1、环境操作1.1 创建环境1.2 激活环境1.3 导出环境1.4 导入环境1.5 关闭环境1.6 删除环境 2、包操作2.1 安装软件包2.2 安装指定包的指定版本 参考资料 Conda介绍 Conda是一个开源的包管理系统和环境管理器&#xff0c;用于在不同的计算环境中安…...

CountDownLatch 和 CyclicBarrier的区别与详解

文章目录 一.CountDownLatch 和 CyclicBarrier的区别二.详解总结用法CountDownLatch 用法CyclicBarrier 用法 一.CountDownLatch 和 CyclicBarrier的区别 CountDownLatch和CyclicBarrier都是线程同步的工具类&#xff0c;都是基于AQS实现的&#xff1b;CountDownLatch 的计数器…...

Vue子组件向父组件传值(this.$emit()方法)

子组件使用this.$emit()向父组件传值 首先必须在父组件中引用子组件&#xff0c;然后实现传值 第一步 在父组件中引入子组件 使用import引入组件 import indexImportOrder from ./components/indexImportOrder 声明 //定义组件components:{indexImportOrder,}, 使用 &l…...

【C++】C/C++内存管理-new、delete

文章目录 一、C/C内存分布二、C/C中动态内存管理方式2.1 C语言中动态内存管理方式2.2 C内存管理方式 三、operator new和operator delete函数3.1 operator new和operator delete函数3.2 operator new与operator delete的类专属重载&#xff08;了解&#xff09; 四、new和delet…...

高手进阶之路---pyqt自定义信号

高手进阶之路—pyqt自定义信号 1.思考问题为什么要自定义信号&#xff0c;qt5本身已有信号槽函数 # pushButton 被clicked的时候connect 函数print self.pushButton.clicked.connect(self.print)def print(self):print("我被点击了")或者使用 # 需要引入 pyqtSlo…...

研磨设计模式day09原型模式

目录 场景 代码实现 有何问题 解决方案 代码改造 模式讲解 原型与new 原型实例与克隆出来的实例 浅度克隆和深度克隆 原型模式的优缺点 思考 何时选用&#xff1f; 相关模式 场景 代码实现 定义订单接口 package com.zsp.bike.day08原型模式;/*** 订单的接口*…...

(二)Redis——List

因为是 List&#xff0c;所以所有相关的命令都以 L 开头。 LPUSH / RPUSH LRANGE list 0 -1 -1 表示末尾 127.0.0.1:6379> LPUSH list a 1 127.0.0.1:6379> LRANGE list 0 -1 a 127.0.0.1:6379> LPUSH list b 2 127.0.0.1:6379> LRANGE list 0 -1 b a 127.0.0.…...

【Go Web 篇】Go 语言进行 Web 开发:构建高性能网络应用

随着互联网的快速发展&#xff0c;Web 开发已经成为了软件开发领域中不可或缺的一部分。随之而来的是对于更高性能、更高效的网络应用的需求。在这个领域&#xff0c;Go 语言因其并发性能、简洁的语法以及丰富的标准库而备受关注。本篇博客将深入探讨如何使用 Go 语言进行 Web …...

开悟Optimization guide for intermediate tracks

目录 认识模型 参考方案&#xff08;按模块拆解&#xff09; 认识模型 模型控制1名英雄进行镜像1 v 1对战 Actor集群资源为64核CPU 问题特点&#xff1a;单一公平对抗场景&#xff08;同英雄镜像对赛&#xff09;&#xff0c;单位时间样本产能低&#xff0c;累计训练资源相…...

wx.request配置服务器域名,只能包含英文大小写字母、数字,解决办法

前言.小程序服务器域名配置常见错误及解决方法 1.配置入口&#xff1a; 小程序后台->-开发->开发设置->服务器域名 2.常见错误及原因分析&#xff1a; 3.实战中出现的错误 4.解决办法&#xff1a;应把域名后边的路径去掉&#xff0c;只写域名即可...

【有效的括号】

题目 1、左括号入栈 2、右括号出栈顶括号进行匹配 栈 typedef char STDataType; //元素为char类型 typedef struct Stack {STDataType* a;//动态的开辟空间int top;int capacity; }ST;void StackInit(ST* ps)//初始化 {assert(ps);ps->a (STDataType*)malloc(sizeof(STD…...

积跬步至千里 || 数学基础、算法与编程

数学基础、算法与编程 1. BAP 技能 BAP 技能是指基础(Basic)、算法(Algorithm)和编程(Programm)三种基本技能的深度融合。理工科以数学、算法与编程为根基&#xff0c;这三个相辅相成又各有区别。 &#xff08;1&#xff09;数学以线性代数为主要研究工具和部分微积分技术为手…...

Java单元测试 JUnit 5 快速上手

一、背景 什么是 JUnit 5&#xff1f;首先就得聊下 Java 单元测试框架 JUnit&#xff0c;它与另一个框架 TestNG 占据了 Java领域里单元测试框架的主要市场&#xff0c;其中 JUnit 有着较长的发展历史和不断演进的丰富功能&#xff0c;备受大多数 Java 开发者的青睐。 而说到…...

【Linux网络】TCP UDP socket HTTP webSocket之间的区别

目录 一、OSI & TCP/IP模型 二、几者之间的关系 三、HTTP 四、Socket 五、WebSocket 5.1、WebSocket 优点 一、OSI & TCP/IP模型 首先我们要了解OSI七层模型&#xff0c;和预支对应的TCP/IP 四层的模型。 用下面的图可以看出&#xff0c;TCP UDP 工作在传输层&…...