java集合类(三)-LinkedList原码分析

目录

前言

原码分析

    继承关系

    类中属性

    构造函数

    核心方法 

总结


前言

       linkedList的底层是双向链表(jdk1.7之后的原码非循环),非线程安全的;由于是链表不同于数据,链表对新增、删除等性能要比数组好很多(并非一定,部分场景性能也可能相似),但是其查询总是从头开始遍历不如支持随机访问的数组性能高;且链表保存数据不需要像数组一样需要连续的空间。

原码分析

接下来我们针对其原码做以下分析:继承关系类中属性构造函数核心方法 四个方面分析

  • AbstractSequentialList:基于list接口,为实现顺序访问的数据存储结构的最小化接口,使用
  • 列表迭代器实现随机访问,对于支持随机访的数据应该选择AbstractList
  • Deque:双端队列,支持两端元素插入和移除的线性集合
  • Cloneable:支持接口,实现Cloneable接口,支持Object.clone()方法(CloneNotSupportedException)
  • java.io.Serializable:标记接口,支持序列化

    继承关系

java集合类(三)-LinkedList原码分析_第1张图片

    类中属性

java集合类(三)-LinkedList原码分析_第2张图片

java集合类(三)-LinkedList原码分析_第3张图片

  • Node first:集合的第一个元素
  • Node last:集合的最后一个元素
  • size:集合的长度
  • Node:集合的节点(链表的单个节点数据结构)

item:节点元素

next: 下一个节点

prev:下一个节点

  • modCount:来源AbstractList,迭代器使用,多线程并发修改触发fail-fast机制

    构造函数

共有2个构造函数:一个构造一个空的集合列表;两一个构造一个包含指定集合元素的列表。

    核心方法 

接下来我们从初始化、新增、修改、查询、删除分析下原码

/**
 * LinkendList 数据结构
 *    LinkedList 底层是链表
 *    .主要结构成员:
 *    .集合操作(初始化、增、删、改、查)
 */
@Test
public void testLinkedList() {
    //初始化
    List linkedList = new LinkedList<>();
    log.info("初始化集合:{}",linkedList);

    //新增
    linkedList.add("a1");linkedList.add("a2");linkedList.add("a3");
    log.info("添加元素a1到集合linkedList:{}",linkedList);

    //修改
    linkedList.set(0,"a1_update");
    log.info("修改位置为0的集合元素linkedList:{}", linkedList);

    //查询
    log.info("查询位置0的集合元素:{}", linkedList.get(0));

    //删除
    log.info("删除集合元素后:{}", linkedList.remove(0));
}

初始化 List linkedList = new LinkedList<>();

构建一个空的列表

新增 linkedList.add("a1")

  • last节点(Node类型)赋值到变量Node l
  • 创建新节点newNode(前置节点为l,后置空节点为NULL;即尾节点)
  • newNode节点赋值给last
  • 原来的last节点即l节点的next指向新增的节点newNode
  • 集合大小size+1
  • 集合修改计数器modCount+1

java集合类(三)-LinkedList原码分析_第4张图片

java集合类(三)-LinkedList原码分析_第5张图片

java集合类(三)-LinkedList原码分析_第6张图片

修改 linkedList.set(0,"a1_update")

  • 验证修改索引位置的合理性
  • 遍历索引出的节点Node
  • 修改此Node的item属性后,返回修改前节点值

java集合类(三)-LinkedList原码分析_第7张图片

java集合类(三)-LinkedList原码分析_第8张图片

查询 linkedList.get(0)

同修改使用的遍历查询node节点方法

java集合类(三)-LinkedList原码分析_第9张图片

删除 linkedList.remove(0)

  • 验证删除节点的索引的合理性
  • 修改当前节点的prev节点的next;并设置当前节点的prev=null
  • 修改当前节点的next节点的prev;并设置当前节点的next=null
  • 修改当前节点的item值为null
  • 集合点size-1;集合的修改计数器modCount-1

java集合类(三)-LinkedList原码分析_第10张图片

java集合类(三)-LinkedList原码分析_第11张图片

java集合类(三)-LinkedList原码分析_第12张图片

总结

  • 链表在物理存储单元上是非连续、非顺序的存储结构
  • 链表不同于数组是动态分配内存,需要时才创建
  • 链表的插入和删除效率高,只需要改变指针的指向就可以了
  • 链表的查找效率低,需要从第一个节点遍历查找
  • LinkedList是双向链表(jdk1.7之后的原

你可能感兴趣的:(java-基础)