LinkedList的继承关系:

  1. LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
  2. LinkedList 实现 List 接口,能对它进行队列操作。
  3. LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
  4. LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
  5. LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
  6. LinkedList 是非同步的。

源码分析

1.构造函数

//无参构造函数
public LinkedList() {}//通过Collection集合来实例化LInkedList的实例public LinkedList(Collection<? extends E> c) {this();addAll(c);}

2.add:添加元素

新建节点,然后调整前后指针信息。

    public boolean add(E e) {linkLast(e);return true;}void linkLast(E e) {final Node<E> l = last;//新构造node节点以链表的尾节点作为前驱,将新节点插入到链表的尾部,尾插法final Node<E> newNode = new Node<>(l, e, null);//将新节点作为尾节点last = newNode;if (l == null)//当前插入的是第一个节点,first=last=newNodefirst = newNode;else//当前链表上已经存在节点l.next = newNode;size++;modCount++;}

3.remove:删除元素

由于删除了某一节点因此调整相应节点的前后指针信息:
e.previous.next = e.next;//预删除节点的前一节点的后指针指向预删除节点的后一个节点。
e.next.previous = e.previous;//预删除节点的后一节点的前指针指向预删除节点的前一个节点。
清空预删除节点:
e.next = e.previous = null;
e.element = null;
交给gc完成资源回收,删除操作结束。

    public boolean remove(Object o) {//删除的元素判断是否为null,判断相等逻辑会不同 o==null? ==:equalsif (o == null) {for (Node<E> x = first; x != null; x = x.next) {if (x.item == null) {unlink(x);return true;}}} else {for (Node<E> x = first; x != null; x = x.next) {if (o.equals(x.item)) {unlink(x);return true;}}}return false;}//删除双向链表的节点逻辑E unlink(Node<E> x) {// assert x != null;final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;if (prev == null) {first = next;} else {prev.next = next;x.prev = null;}if (next == null) {last = prev;} else {next.prev = prev;x.next = null;}x.item = null;size--;modCount++;return element;}

4.get:获取节点元素

首先判断位置信息是否合法(大于等于0,小于当前LinkedList实例的Size),然后遍历到具体位置,获得节点的业务数据(element)并返回。

    public E get(int index) {//判断位置的合法性checkElementIndex(index);return node(index).item;}private void checkElementIndex(int index) {if (!isElementIndex(index))throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}private boolean isElementIndex(int index) {return index >= 0 && index < size;}//从链表中的位置index来找到节点NodeNode<E> node(int index) {//通过二分查找来确定要查找元素的位置,在size/2前半部分,采用从前往后查找,否则,从后往前查找if (index < (size >> 1)) {Node<E> x = first;for (int i = 0; i < index; i++)x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--)x = x.prev;return x;}}

和ArrayList区别:

1、ArrayList是基于动态数组的数据结构、LinkedList是基于链表实现

2、对于随机访问的get和set方法,ArrayList有优于LInkedList,因为LInkedList要移动指针

3、对于新增和删除操作,LinkedList比较占优势,因为ArrayList要移动数据

应用场景:

ArrayList使用在查询比较多场景,而LinkedList适用于插入删除比较多场景

LinkedList相关知识相关推荐

  1. JS作用域相关知识(#精)

    在学习<你不知道的JS>一书中,特将作用域相关知识在此分享一下: #说到作用域,就不得不提到LHS查询和RHS查询: 1)如果查询目的是对变量进行赋值,则使用LHS查询 2)如果查询目的是 ...

  2. 工业相机参数之帧率相关知识详解

    点击上方"小白学视觉",选择加"星标"或"置顶"重磅干货,第一时间送达 工业相机是机器视觉系统的重要组成部分之一,在机器视觉系统中有着非常重 ...

  3. shell的相关知识(变量、脚本定义)

    一.shell的相关知识: 1.对于shell编程语言大体分为:机器语言.汇编语言.高级语言 2.shell变量类型:事先确定数据的存储格式和长度 shell变量分为:字符型.数值型 数值型又分为:整 ...

  4. 视频压缩算法的相关知识

    视频压缩算法的相关知识 MPEG-1 MPEG 视频压缩编码后包括三种元素:I帧(I-frames).P帧(P-frames)和B帧(B-frames).在MPEG编码的过程中,部分视频帧序列压缩成为 ...

  5. linux 格式化 dvd,linux 服务器分区格式化相关知识 -mount

    关于linux 系统mount和mkfs 的相关知识: 使用mount 1)Mount的相关格式:mount [-t 文件类型][-o  选项] devicedir 详解: -t 文件类型,通常默认m ...

  6. WinForm开发,窗体显示和窗体传值相关知识总结

    以前对WinForm窗体显示和窗体间传值了解不是很清楚 最近做了一些WinForm开发,把用到的相关知识整理如下 A.WinForm中窗体显示显示窗体可以有以下2种方法: Form.ShowDialo ...

  7. js基础--数据类型检测的相关知识

    欢迎访问我的个人博客:www.xiaolongwu.cn 前言 最近工作有点忙,好几天都没更新技术博客了. 周末起床打开有道云笔记,发现自己的博客todolist里躺了一堆只有名字的文件. 话不多说, ...

  8. 转载:关于错排的相关知识

    转载:关于错排的相关知识 杭电2048相关知识充电 转自:错排公式 分类: 数论 关于程序2012-06-08 19:07 335人阅读 评论(0) 收藏 举报 n2 错排问题 错排问题 就是一种递推 ...

  9. VMware虚拟网络相关知识

    VMware虚拟网络相关知识 虚拟网桥         通过虚拟网桥把虚拟机的虚拟网卡连接到宿主机的物理网卡上.通过它可以将虚拟机连接到宿主机所在的外部网络.如果宿主机上不止是一个物理网卡时,采用定制 ...

最新文章

  1. Java开发中最常犯的10个错误,你中招了吗?
  2. android studio无法新建工程,我刚刚升级了Android Studio3.3.2,但是我不能创建一个新的项目。这里是错误日志。我使用的开发语言是Java。...
  3. go语言笔记——调试还很弱,用gdb来做?可用panic和defer。格式化代码使用gofmt,貌似我的vim插件是自带...
  4. php 类 init,基于initPHP的框架介绍
  5. 【转】UNITY之LUA加密
  6. LeetCode Algorithm 897. 递增顺序搜索树
  7. 大数据时代的数据存储,非关系型数据库MongoDB(一)(转)
  8. MNIST 手写数字识别,我是如何做到886个可训练参数,识别率达到98.2%? (参数、模型压缩), Keras实现,模型优化
  9. Linux内存显示错误,使用mmap读取内存的内容,出现“Segmentation fault”错误,请
  10. php负载均衡如何获得真实ip,nginx负载均衡后端RS中获取真实ip
  11. 李宏毅机器学习——梯度下降
  12. iOS:const的使用
  13. UOJ#211. 【UER #6】逃跑 (Dynamic Programming)
  14. 关于b-jui框架,datagrid传参数的问题
  15. thingworx项目-mushup
  16. 我实测了国内外GPT,问了10个问题,差点把电脑砸了...
  17. Android开发中Preconditions前置条件判断
  18. date日期格式中文和英文显示
  19. 炉石传说android手机版本,炉石传说安卓版下载gpu型号选择详细讲解介绍
  20. 计算机快捷键大全windows,windows系统常见快捷键大全

热门文章

  1. 什么是面向对象程序设计
  2. 拿什么兜底2亿灵活就业者的职业伤害?
  3. 数据挖掘--“聚类”详解、K-means、K-平均值算法、K均值算法
  4. html页面手机自动缩放,解决HTML5手机端页面缩放的问题
  5. 手机自带计算机删了怎么恢复出厂设置,还原出厂设置会怎样_电脑如何恢复出厂设置...
  6. OA系统十八:请假申请四:【请假申请】这个内嵌界面中【提交请假表单数据】的Controller层;
  7. 计算机科学与技术用惠普星15,设计与科技的完美融合惠普 x360
  8. 基于原生js和css3实现barrage弹幕效果
  9. bbcp linux,使用BBCP来提高跨网数据传输速度
  10. Observable详解