LinkedList详解

article/2025/9/11 1:04:35

文章目录

  • 介绍
    • 继承体系
  • LinkedLists实现
    • 底层数组结构
    • 构造函数
    • getFirst(),getLast()
    • removeFirest(),removeLast(),remove(e),remove(index)
    • 删除head元素
    • 删除last元素
    • add()
    • addAll()
    • clear()
    • 查找操作
    • 遍历

介绍

LinkedList同时实现了List接口和Deque对口,也就是收它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack),这样看来,linkedList简直就是无敌的,当你需要使用栈或者队列时,可以考虑用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(只是一个接口的名字)。关于栈或队列,现在首选是ArrayDeque,它有着比LinkedList(当作栈或队列使用时)更好的性能。
在这里插入图片描述
LinkedList的实现方式决定了所有跟下表有关的操作都是线性时间,而在首段或者末尾删除元素只需要常数时间。为追求效率LinkedList没有实现同步(synchronized),如果需要多个线程并发访问,可以先采用Collections.synchronizedList()方法对其进行包装。

继承体系

LinkedList 的继承体系较为复杂,继承自 AbstractSequentialList,同时又实现了 List 和 Deque 接口。
在这里插入图片描述
LinkedList 继承自 AbstractSequentialList,AbstractSequentialList 又是什么呢?从实现上,AbstractSequentialList 提供了一套基于顺序访问的接口。通过继承此类,子类仅需实现部分代码即可拥有完整的一套访问某种序列表(比如链表)的接口。深入源码,AbstractSequentialList 提供的方法基本上都是通过 ListIterator 实现的,比如:
在这里插入图片描述
所以只要继承类实现了listIterator方法,它不需要再额外实现什么即可使用。对于随机访问集合类一般建议继承AbstractList而不是AbstractSequentialList。LinkedList和其他父类一样,也是基于顺序访问。所以LinkedList继承了AbstractSequentialList,但LinkedList并没有直接使用父类的方法,而是重新实现了一套方法。
另外,LinkedList还实现了Deque(double ended queue),Deque又继承自Queue接口。这样LinkedList就具备了队列的功能。比如:

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

LinkedLists实现

底层数组结构

LinkedList底层通过双向链表实现,双向链表的每个节点用内部类Node表示。LinkedList通过first和last引用分别指向链表的第一个和最后一个元素。
在这里没有所谓的哑元,当链表为空的时候first和last都指向null。
在这里插入图片描述
其中Node是私有的内部类
在这里插入图片描述

构造函数

在这里插入图片描述

getFirst(),getLast()

获取第一个元素以及获取最后一个元素
在这里插入图片描述

removeFirest(),removeLast(),remove(e),remove(index)

remove()方法同样是有两个版本,一个是根据指定元素删除匹配相等的第一个元素remove(Object o),另一个是删除指定下标处的元素remove(int index)。
在这里插入图片描述
删除元素-指的是删除第一次出现的这个元素,如果没有这个元素,则返回false;判断的依据是equals方法,如果是equals,则直接unlink这个node;由于LinkedList可存放null元素,故也可以删除第一次出现null的元素;
在这里插入图片描述
在这里插入图片描述
remove(int index)使用的是下标计数,只需要判断该index是否有元素即可,如果有则直接unlink这个node。
在这里插入图片描述

删除head元素

在这里插入图片描述
在这里插入图片描述

删除last元素

在这里插入图片描述
在这里插入图片描述

add()

add()方法也有两个版本,一个add(E e),该方法在LinkedList的末尾插入元素,因为有last指向链表末尾,在末尾插入元素的花费是常数时间,只需简单修改几个相关引用即可;另外一个add(int index,E e),该方法是在指定下标出插入元素,需要通过线性查找找到具体位置,然后修改相关引用完成插入操作。
在这里插入图片描述
在这里插入图片描述
add(int index,E e),当index==size时,等同于add(E e);如果不是,则需要分为两步:

  • 现根据index找到要插入的位置,即node(index)方法;
  • 修改引用,完成插入操作
    在这里插入图片描述
    上面代码中的node(int index)函数有一点小trick,因为链表时双向的,可以从后往前找,也可以从前往后招,具体朝哪个方向取决于条件 index < (size >> 1) ,也就是index是靠近前端还是后端。从这里可以看出,linkedList通过index检查元素的效率没有arrayList高。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
LinkedList新增元素的逻辑流程
(1)创建新节点,并指明新节点的前驱和后继
(2)将succ的前驱引用指向新节点
(3)如果succ的前驱不为空,则将succ前驱的后继引用指向新节点

addAll()

addAll(index,c)实现方式并不是直接调用add(index,e)实现的,主要是因为效率问题,另一个就是fail-fast中modCount只会增加1次;
在这里插入图片描述
在这里插入图片描述

clear()

为了让GC更快可以回收放置的元素,需要将node之间的引用关系赋空
在这里插入图片描述

查找操作

LinkedList 底层基于链表结构,无法向 ArrayList 那样随机访问指定位置的元素。LinkedList 查找过程要稍麻烦一些,需要从链表头结点(或尾节点)向后查找,时间复杂度为 O(N)。
在这里插入图片描述
主要是通过遍历的方式定位目标位置的节点。获取到节点后,取出节点存储的值返回即可。这里面有个小优化,即通过比较 index 与节点数量 size/2 的大小,决定从头结点还是尾节点进行查找。

遍历

链表的遍历过程也很简单,和上面查找过程类似,我们从头节点往后遍历就行了。但对于 LinkedList 的遍历还是需要注意一些,不然可能会导致代码效率低下。通常情况下,我们会使用 foreach 遍历 LinkedList,而 foreach 最终转换成迭代器形式。所以分析 LinkedList 的遍历的核心就是它的迭代器实现。
在这里插入图片描述
在这里插入图片描述
TIP:LinkedList不擅长随机位置访问,如果使用随机访问遍历LinkedList效率会很差,如下:
在这里插入图片描述


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

相关文章

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…

motan源码分析三:与spring框架的结合

在本文第一章&#xff0c;分析的demo中使用了代码加载的方式加载了相关的类&#xff0c;但在我们的实际工作中&#xff0c;使用spring来加载相关的类的情况会更多&#xff0c;本文将分析一下motan是如何与spring一起协同工作的&#xff0c;主要的原理就是利用了spring支持的自定…

motan源码分析一:服务发布及注册

motan是新浪微博开源的服务治理框架&#xff0c;具体介绍请看&#xff1a;http://tech.sina.com.cn/i/2016-05-10/doc-ifxryhhh1869879.shtml. 本系列的文章将分析它的底层源码&#xff0c;分析的源码版本为&#xff1a;0.1.2。第一篇文章将以服务的发布和注册开始&#xff0c;…

轻量级Rpc框架设计--motan源码解析六:client端服务发现

一, Client端初始化工作 client端通过RefererConfigBean类实现InitializingBean接口的afterPropertiesSet方法, 进行下面三项检查配置工作: ①checkAndConfigBasicConfig(); // 检查并配置basicConfig ②checkAndConfigProtocols(); //检查并配置protocols ③checkAndConfi…

java rpc motan_【RPC 专栏】Motan 中使用异步 RPC 接口

为什么慢&#xff1f; 多线程加速 异步调用 RPC 异步调用 总结 这周六参加了一个美团点评的技术沙龙&#xff0c;其中一位老师在介绍他们自研的 RPC 框架时提到一点&#xff1a;RPC 请求分为 sync&#xff0c;future&#xff0c;callback&#xff0c;oneway&#xff0c;并且需要…

Motan-远程调用的rpc框架的负载均衡策略

虽然我不会&#xff0c;但是偶然之间看到了Motan远程调用框架的一些内容&#xff0c;然后直接copy过来了&#xff0c;想着以后自己可能看看 集群中的loadbalance负载均衡策略 ActiveWeightLoadBalance"低并发优化" 负载均衡 /** Copyright 2009-2016 Weibo, Inc.** …

motan源码分析五:cluster相关

上一章我们分析了客户端调用服务端相关的源码&#xff0c;但是到了cluster里面的部分我们就没有分析了&#xff0c;本章将深入分析cluster和它的相关支持类。 1.clustersupport的创建过程&#xff0c;上一章的ReferConfig的initRef()方法中调用了相关的创建代码&#xff1a; fo…

java 微博 开源_微博开源框架Motan初体验

前两天&#xff0c;我在开源中国的微信公众号看到新浪微博的轻量Rpc框架——Motan开源了。上网查了下&#xff0c;才得知这个Motan来头不小&#xff0c;支撑着新浪微博的千亿调用&#xff0c;曾经在2014年的春晚中有着千亿次的调用&#xff0c;对抗了春晚的最高峰值。 什么是Mo…

搭建新浪RPC框架motan Demo

motan是新浪微博开源的RPC框架&#xff0c;github官网是&#xff1a;https://github.com/weibocom/motan 今天就先搭建一个Hello world demo&#xff0c;本demo基于motan 0.2.1版本 首先先去github下载源代码&#xff08;motan-manager报错请忽略&#xff0c;eclipse的web Mod…

微博RPC框架Motan

原文来自&#xff1a;http://blog.csdn.net/autfish/article/details/51374798 从14年开始就陆续看到新浪微博RPC框架Motan的介绍&#xff0c;时隔两年后&#xff0c;微博团队终于宣布开源轻量级RPC框架Motan&#xff0c;项目地址&#xff1a; https://github.com/weibocom/mot…