LinkedList 基本使用

article/2025/9/11 1:10:48

文章目录

  • 1. LinkedList 简介
  • 2. LinkedList 底层操作机制
  • 3. LinkedList 源码分析
  • 4. LinkedList 增删改查案例
  • 5. ArrayList和LinkedList比较

1. LinkedList 简介

  1. LinkedList 底层实现了 双向链表和双端队列 特点
  2. 可以添加任意元素(元素可以重复),包括null
  3. 线程不安全,没有实现同步

2. LinkedList 底层操作机制

在这里插入图片描述

  1. LinkedList 底层维护了一个双向链表.
  2. LinkedList 中维护了两个属性firstlast分别指向首节点和尾节点
  3. 每个节点(Node对象) ,里面又维护了 prev、 next. item 三个属性,其中 prev 指向前一个,通过 next 指向后一个节点。 最终实现双向链表
  4. 所以 LinkedList 的元素的添加和删除,不是通过数组完成的,相对来说效率较高。
  5. 模拟一个简单的双向链表,如:
    在这里插入图片描述
  • 双向链表的简单使用
public class LinkedList01 {public static void main(String[] args) {// 模拟一个简单的双向链表Node tom = new Node("tom");Node jack = new Node("jack");Node xdr = new Node("xdr");//连接三个点,形成双向链表// tom->jack->xdrtom.next = jack;jack.next = xdr;// xdr->jack->tomxdr.pre = jack;jack.pre = tom;Node first = tom;//让 first 引用指向 jack,就是双向链表的头节点Node last = xdr; //让 last 引用指向 xdr,就是双向链表的尾节点// 从头到尾进行遍历System.out.println("===从头到尾进行遍历===");while (true) {if (first == null) {break;}//输出 first 信息System.out.println(first);first = first.next;}//从尾到头的遍历System.out.println("====从尾到头进行遍历====");while (true) {if (last == null) {break;}//输出 last 信息System.out.println(last);last = last.pre;}}
}// 定义一个 Node 类,Node 对象,表示双向链表的一个节点
class Node {public Object item; // 真正存放的数据public Node next; // 指向后一个节点public Node pre; // 指向前一个节点public Node(Object name) {this.item = name;}public String toString() {return "Node name=" + item;}
}

在这里插入图片描述

  • 在链表中插入元素,如:在 jack 和 xdr 中间插入一个对象 mike
	//先创建一个 Node 结点,name 就是 mikeNode mike = new Node("mike");//下面就把 mike 加入到双向链表了mike.next = xdr;mike.pre = jack;xdr.pre = mike;jack.next = mike;//让 first 再次指向 tomfirst = tom;//让 first 引用指向 tom,就是双向链表的头结System.out.println("===从头到尾进行遍历===");while (true) {if (first == null) {break;}//输出 first 信息System.out.println(first);first = first.next;}// 从尾到头进行遍历last = xdr; //让 last 重新指向最后一个节点//从尾到头的遍历System.out.println("====从尾到头进行遍历====");while (true) {if (last == null) {break;}//输出 last 信息System.out.println(last);last = last.pre;}

在这里插入图片描述

3. LinkedList 源码分析

1、案例:打断点进行源码分析

	LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);
1. LinkedList linkedList = new LinkedList();public LinkedList() {}2. 这时 linkeList 的属性 first = null  last = null3. 执行 添加public boolean add(E e) {linkLast(e);return true;}  4.将新的结点,加入到双向链表的最后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++;}

2、演示删除节点的源码:linkedList.remove(); 这里默认删除的是第一个节点

1. 执行 removeFirstpublic E remove() {return removeFirst();}2. 执行public E removeFirst() {final Node<E> f = first;if (f == null)throw new NoSuchElementException();return unlinkFirst(f);}3. 执行 unlinkFirst, 将 f 指向的双向链表的第一个结点拿掉private E unlinkFirst(Node<E> f) {// assert f == first && f != null;final E element = f.item;final Node<E> next = f.next;f.item = null;f.next = null; // help GCfirst = next;if (next == null)last = null;elsenext.prev = null;size--;modCount++;return element;}

4. LinkedList 增删改查案例

  • 删除一个节点
LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);System.out.println(linkedList);linkedList.remove();System.out.println(linkedList);

在这里插入图片描述

  • 修改某个节点对象,index 索引是按照 0 开始编号的
LinkedList linkedList = new LinkedList();linkedList.add(1);linkedList.add(2);linkedList.add(3);System.out.println(linkedList);linkedList.remove();System.out.println(linkedList);linkedList.set(1, 2233);System.out.println(linkedList);

在这里插入图片描述

  • 得到某个结点对象,get(1) 是得到双向链表的第二个对象
Object o = linkedList.get(1);
System.out.println(o);

在这里插入图片描述

  • LinkedList 是 实现了List接口,遍历方式可以用 迭代器、增强for、普通for 进行遍历
	System.out.println("===迭代器遍历===");Iterator iterator = linkedList.iterator();while (iterator.hasNext()) {Object next = iterator.next();System.out.println("next=" + next);}System.out.println("===增强for循环遍历===");for (Object o : linkedList) {System.out.println("o=" + o);}System.out.println("===普通for循环遍历===");for (int i = 0; i < linkedList.size(); i++) {System.out.println(linkedList.get(i));}

在这里插入图片描述

5. ArrayList和LinkedList比较

在这里插入图片描述

  • 如何选择 ArrayList 和 LinkedList :
  1. 如果改查的操作多,选择ArrayList
  2. 如果增删的操作多,选择LinkedList
  3. 一般来说,在程序中,80%-90%都是查询,因此大部分情况下会选择ArrayList
  4. 在一个项目中,根据业务灵活选择,一个模块使用的是ArrayList,另外一个模块是LinkedList,也就是说,要根据业务需求来进行选择。

http://chatgpt.dhexx.cn/article/GfxbuN1Z.shtml

相关文章

java linkedlist poll_java之LinkedList详细介绍

1 LinkedList介绍 LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口&#xff0c;能对它进行队列操作。 LinkedList 实现 Deque 接口&#xff0c;即能将LinkedList当作双端队…

LinkedList简介

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口&#xff0c;能对它进行队列操作。 LinkedList 实现 Deque 接口&#xff0c;即能将LinkedList当作双端队列使用。 LinkedList 实现了Clo…

LinkedList特点

聊一聊LinkedList的特点吧~&#xff08;以下都是基于jdk1.8&#xff09; 继承树 LinkedList的继承树如下图&#xff1a; 特点 &#xff08;1&#xff09;允许null值 &#xff08;2&#xff09;内部以双向链表的形式来保存集合中的元素 /*** Pointer to first node.* Inva…

数据结构之链表(LinkedList详解)

文章目录 一、什么是LinkedList&#xff1f;二、LinkedList的使用三、LinkedList自实现四、链表实现逆序打印的两种方式&#xff08;递归和非递归&#xff09; 五、ArrayList和LinkedList有什么区别&#xff1f; 一、什么是LinkedList&#xff1f; LinkedList的底层是 双向链表…

LinkedList用法详解

一、LinkedList简单介绍 LinkedList是List接口的实现类&#xff0c;因此也实现了List的方法。但LinkedList是采用链表结构的方式来实现List接口的&#xff0c;因此在进 行insert 和remove动作时效率要比ArrayList高。 二、LinkedList的用法介绍 1、add和push 通过这两种方法均…

Java集合类——LinkedList(单链表及双链表)

一&#xff0c;ArrayList的缺陷 1.空间浪费 在之前的博客中&#xff0c;我利用源码详细的讲解了ArrayList这个集合类&#xff08;尤其是扩容机制&#xff09;&#xff0c;可以知道ArrayList的底层主要是一个动态的可变数组&#xff0c;容量满的时候需要进行1.5倍扩容。但是我…

java学习之LinkedList(链表)

LinkedList&#xff1a;一种线性表&#xff0c;但不按照线性顺序存储数据&#xff08;实际上为链表&#xff09;。 链表分为单向链表和双向链表&#xff0c;实际应当还有循环链表。 单向链表&#xff1a;将一个区域分成两部分&#xff0c;分别为节点区域和数据域。 如下图所…

LinkedList和ArrayList对比各有什么优势?

一、LinkedList的概述 1. LinkedList是双向链表实现的List 2. LinkedList是非线程安全的 3. LinkedList元素允许为null&#xff0c;允许重复元素 4. LinkedList是基于链表实现的&#xff0c;因此插入删除效率高&#xff0c;查找效率低(虽然有一个加速动作) 5. LinkedList是…

LinkedList详解

文章目录 介绍继承体系 LinkedLists实现底层数组结构构造函数getFirst(),getLast()removeFirest(),removeLast(),remove(e),remove(index)删除head元素删除last元素add()addAll()clear()查找操作遍历 介绍 LinkedList同时实现了List接口和Deque对口&#xff0c;也就是收它既可…

Chrome被百度网页劫持

Chrome被百度劫持的解决办法 浏览器的运行太慢了&#xff0c;就想试试谷歌的浏览器&#xff0c;但是每次打开的都是百度的界面&#xff0c;明显就是被劫持了&#xff0c; 看了网上的好多方法都没有什么明显的效果 问题 在使用Chrome浏览器打开后直接弹出一个百度的界面这看着就…

网页被劫持怎么修复?主页被劫持修复方法

电脑的浏览器被劫持了应该怎么解决&#xff1f;小编今天就来教大家解决电脑浏览器自动跳转到一个网页中的问题。 方法步骤 1.随着网络的兴起&#xff0c;更多的小伙伴享受到网络带来的便利生活&#xff0c;其中上网浏览就是非常受欢迎的一个功能&#xff0c;但是很多不法分子看…

Google Chrome主页被iduba劫持解决方法

今天用电脑的时候发现google的主页被改成了iduba的主页&#xff0c;烦的一比&#xff0c;看了好久才解决1.查看chrome://version 在命令行处会发现带有iduba的网站&#xff0c;我这里解决了&#xff0c;就没有了 2.点开google快捷方式的属性进行修改 将命令行中的代码全部复制…

浏览器被劫持怎么解决?关于浏览器被劫持主页的处理方法

背景: 上个月重做了win10系统,系统激活过程中没有出现任何问题。重装office套装,使用暴风激活下载地址: (http://win.shibojiaa.cn/baofeng/)激活office套装后,发现所有浏览器主页被劫持。打开任何一个浏览器地址栏中显示:(http://uj7.gndh555.top/)随后跳转hao123。…

Microsoft edge 主页被劫持的处理办法

最根本的办法&#xff0c;如果是任务栏固定打开后发现主页被劫持&#xff0c;应该是弄明白任务栏的链接是来自电脑的开始页面还是桌面的快捷方式。 如果是开始界面应用固定于任务栏&#xff0c;那么找到开始界面的Microsoft edge&#xff0c;右键然后找到所在文件夹。 找到开始…

浏览器主页被劫持,跳转hao123解决办法!

劫 持 指 南 前戏-疑难杂症小妙招 当打开电脑准备划水时&#xff0c;结果一打开浏览器&#xff0c;就发现它自动打开一个新的链接&#xff0c;紧接着又跳转到一个特定网页上去了&#xff0c;大家肯定心里那个气啊&#xff0c;打开百度一顿搜索&#xff0c;试了各种方法都不行…

百度主页被“/?tn=88093251_85_hao_pg“劫持的一种解决办法

前言 在闲暇之余换了个系统&#xff0c;为了方便使用了在线的小白一键装机安装的win10专业版&#xff0c;先抛开携带的各种垃圾软件不说&#xff0c;最不爽的还是主页无论如何修改都被百度劫持。 内容 尝试了网上各种解决办法&#xff0c;其中包括但不限于&#xff1a; 下…

Chrome主页被劫持怎么破

之前遇到Chrome被2345劫持了&#xff0c;导致的结果是每天初次打开Chrome都会进入2345的流氓主页&#xff0c;尝试了若干解决办法&#xff0c;最终得以解决。现简要记录一下所尝试过的方法以及解决过程&#xff0c;以下所涉及到的任何一种能够方法都有可能导致Chrome浏览器的劫…

教你解决浏览器被360劫持篡改主页的麻烦

前言 相信很多的小伙伴都遇到一个问题&#xff0c;就是好端端的&#xff0c;打开自己的edge或者Chrome&#xff0c;突然发现自己的主页变成了这样&#xff08;下图&#xff09; 不得不说&#xff0c;这个看得人真的不适。&#xff08;晕&#x1f635;&#xff09;相信大部分人还…

Motan RPC

中文文档&#xff1a;https://github.com/weibocom/motan/wiki/zh_userguide#%E9%85%8D%E7%BD%AE%E8%AF%B4%E6%98%8E 微信公众号

Motan整体结构详述

简述 Motan是一套高性能、易于使用的分布式远程服务调用(RPC)框架。 文章结构 1.调用详解 2.注册中心 3.支持的协议 4.配置概述 5.注解配置 6.架构概述 7.模块概述 8.运维监控 高清原图见脑图地址http://naotu.baidu.com/file/2832af5a32a02ea63bb0e826a966d502?token4e7921e3…