博客
关于我
LinkedList源码分析--jdk1.8
阅读量:791 次
发布时间:2023-01-31

本文共 2821 字,大约阅读时间需要 9 分钟。

JDK 8与LinkedList详细技术分析

JDK 8引入的LinkedList是一个基于内部类Node的双向链表,实现了List、Deque等接口。本文将从数据结构、源码分析、核心方法以及实际应用等方面探讨LinkedList的技术细节。

LinkedList的数据结构概述

LinkedList采用双向链表结构,每个节点包含以下成员:

  • element:存储实际数据
  • next:指向下一个节点
  • prev:指向前一个节点

双向链表具有如下特点:

  • 双向性:每个节点既有next指针(指向下一个节点),也有prev指针(指向上一个节点)
  • 无环且可逆:第一个节点的prev指向null,最后一个节点的next指向null
  • 插入删除高效:节省内存,直接修改邻接指针即可完成增删改查
  • LinkedList源码分析

    LinkedList类继承自AbstractSequentialList,实现了List、Deque等接口。其核心源码包括:

    public class LinkedList extends AbstractSequentialList
    implements List
    , Deque
    , Cloneable, Serializable { transient int size = 0; transient Node
    first; transient Node
    last; private static class Node
    { E item; Node
    prev; Node
    next; Node(Node
    prev, E element, Node
    next) { this.prev = prev; this.item = element; this.next = next; } } public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { Node
    l = last; Node
    newNode = new Node<>(l, e, null); last = newNode; if (l == null) { first = newNode; } else { l.next = newNode; } size++; modCount++; } public E remove() { return removeFirst(); } private E removeFirst() { Node
    f = first; unlinkFirst(f); return f.item; } private E unlinkFirst(Node
    f) { Node
    next = f.next; f.prev = null; if (f == last) { last = next; } if (next != null) { next.prev = null; } size--; modCount++; return f.item; } // 其他核心方法包括`remove(int index)`、`remove(Object o)`、`removeFirstOccurrence(Object o)`、`removeLastOccurrence(Object o)`、`linkBefore()`等}

    LinkedList的继承和实现

    LinkedList继承结构:

    LinkedList├── AbstractSequentialList│  └── AbstractList│     └── AbstractCollection└── Object

    实现的接口包括:

  • List
    :提供基本的集合操作方法
  • Deque
    :实现带有两端操作的队列接口
  • Cloneable:支持浅拷贝操作
  • Serializable:支持序列化操作
  • 核心方法分析

    LinkedList的增删方法采用了“快_delete”和“慢_delete”两种策略:

  • 快速删除:直接处理相邻节点进行调整
  • 慢删除:通过遍历找到目标节点后进行删除
  • 增加操作

    LinkedList提供6种重载的add方法:

  • add(E e):默认在尾部添加
  • add(int index, E e):在指定位置插入元素
  • addAll(Collection<E>)
  • addAll(int index, Collection<E>)
  • addFirst(E e)
  • addLast(E e)
  • 删除操作

    LinkedList提供7种重载的remove方法:

  • remove()
  • remove(int index)
  • remove(Object o)
  • removeFirst()
  • removeLast()
  • removeFirstOccurrence(Object o)
  • removeLastOccurrence(Object o)
  • 获取操作

    LinkedList提供的get方法包括:

  • get(int index)
  • getFirst()
  • getLast()
  • 查找操作

  • indexOf(Object o):从头到尾查找
  • lastIndexOf(Object o):从尾到头查找
  • 克隆操作

    LinkedList支持浅行拷贝:

    public Object clone() {    LinkedList
    clone = new LinkedList<>(); clone.first = null; clone.last = null; clone.size = 0; clone.modCount = 0; for (Node
    x = first; x != null; x = x.next) { clone.add(x.item); } return clone;}

    LinkedList的实际应用价值

  • 插入和删除效率高:仅需调整邻接指针,无需移动数据
  • 适用于需要频繁操作两端的场景:如双端队列 manipulation
  • 内存占用低:占用空间仅与元素数量成正比
  • 提供多种操作便利:支持集合、队列、序列化等多种功能
  • 总结

    LinkedList作为Java Collections家族的一员,凭借其双向链表架构,在数据存储与操作方面展现出独特优势。尽管其随机访问效率低于数组实现,但在灵活性和快速操作方面做到了极致。对于需要经常操作列表两端的应用场景, LinkedList 是一个理想的选择。

    转载地址:http://ykwfk.baihongyu.com/

    你可能感兴趣的文章
    LeetCode二叉树从上至下路径问题总结(112.113.437.129)
    查看>>
    leetcode出现cannot find symbol [in __Driver__.java]
    查看>>
    LeetCode哈希表+字符类的题目总结
    查看>>
    LeetCode地平线专场——第308场周赛题解
    查看>>
    LeetCode数据库题目汇总二(附答案)
    查看>>
    LeetCode新手指南:从零开始掌握算法挑战
    查看>>
    LeetCode智加科技专场——第207场周赛题解
    查看>>
    leetcode正则表达式匹配
    查看>>
    leetcode算法题解(Java版)-6-链表,字符串
    查看>>
    LeetCode经典——70.爬楼梯&&509.斐波拉契数列
    查看>>
    LeetCode蔚来专场——第208场周赛题解
    查看>>
    leetcode题解-买卖股票的最佳时机
    查看>>
    leetcode题解102-二叉树的层序遍历
    查看>>
    leetcode题解102-翻转二叉树
    查看>>
    leetcode题解104- 二叉树的最大深度
    查看>>
    leetcode题解108-将有序数组转换为二叉排序树
    查看>>
    leetcode题解118-杨辉三角
    查看>>
    leetcode题解131-分割回文串
    查看>>
    leetcode题解136-只出现一次的数字
    查看>>
    leetcode题解14-最长公共前缀
    查看>>