Java LinkedList的实现原理图文详解

首先,我们来了解一下Java LinkedList的基本特性。LinkedList是Java中实现链表数据结构的一种方式,它实现了List、Deque、Queue接口。LinkedList内部以链表的形式存储元素,每个节点都包含上一个节点的引用和下一个节点的引用。因此可以方便的在链表的任意位置进行添加、删除操作,但是随机访问某个元素的效率会比较低。

LinkedList类主要包含了以下几个成员变量:

transient int size = 0; // 链表大小,该变量用transient修饰,表示不会被进行序列化
transient Node<E> first; // 链表首节点
transient Node<E> last; // 链表尾节点

同时它还包括了一个内部类Node作为链表节点,该类包含了元素存储、上一个节点的引用和下一个节点的引用。

private static class Node<E> {
    E item;
    Node<E> next;
    Node<E> prev;

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

接下来,我们可以看一下LinkedList的一些基本操作的实现过程。

1、添加元素

对于向链表尾部添加元素的操作,我们只需要将新元素添加到链表末尾节点的后面即可。

public boolean add(E e) {
    linkLast(e);
    return true;
}

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;
    } else {
        l.next = newNode;
    }
    size++;
}

对于向链表中间位置添加元素的操作,我们需要将新元素插入到相应位置,并修改相应节点的前后节点的引用。

public void add(int index, E element) {
    checkPositionIndex(index);

    if (index == size) {
        linkLast(element);
    } else {
        linkBefore(element, node(index));
    }
}

void linkBefore(E e, Node<E> succ) {
    final Node<E> pred = succ.prev;
    final Node<E> newNode = new Node<>(pred, e, succ);
    succ.prev = newNode;
    if (pred == null) {
        first = newNode;
    } else {
        pred.next = newNode;
    }
    size++;
}

2、删除元素

对于删除尾部元素的操作,我们只需要将尾部节点的前一个节点作为新的尾部节点即可。

public E removeLast() {
    final Node<E> l = last;
    if (l == null)
        throw new NoSuchElementException();
    return unlinkLast(l);
}

private E unlinkLast(Node<E> l) {
    final E element = l.item;
    final Node<E> prev = l.prev;
    l.item = null;
    l.prev = null;
    last = prev;
    if (prev == null)
        first = null;
    else
        prev.next = null;
    size--;
    return element;
}

对于删除中间节点的操作,我们需要找到对应节点,修改上下节点的引用即可。

public E remove(int index) {
    checkElementIndex(index);
    return unlink(node(index));
}

E unlink(Node<E> x) {
    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--;
    return element;
}

通过以上基本操作可以看出,LinkedList主要是以双向链表的形式存储数据,因此可以方便的进行添加、删除等操作。但是由于需要遍历链表才能访问某个元素,因此不适用于随机访问与修改。

示例一:

LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);

以上示例添加了1、2、3、4四个元素到链表中。

示例二:

LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(1, 5);

以上示例在第二个元素的位置插入了5这个元素。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java LinkedList的实现原理图文详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Commons beanutils组件简介

    Commons BeanUtils 组件简介 Commons BeanUtils 组件是 Apache Common 组件库中的一个组件,它提供了许多用于操作 JavaBean 对象的工具类。 功能介绍 Commons BeanUtils 主要提供以下几个方面的功能: 属性拷贝 BeanUtils 提供了一个 copyProperties() 方法,用于从一…

    Java 2023年6月15日
    00
  • Eclipse配置maven环境的图文教程

    下面我就为你详细讲解“Eclipse配置maven环境的图文教程”的完整攻略。 准备工作 在开始配置maven环境前,我们需要先下载和安装maven,具体步骤如下: 访问Maven官网(https://maven.apache.org/),并下载对应操作系统的安装包; 解压下载的压缩包到指定的目录下,比如D:\Program Files\apache-mav…

    Java 2023年5月20日
    00
  • Python进阶学习之特殊方法实例详析

    我会为您详细讲解“Python进阶学习之特殊方法实例详析”的完整攻略。 什么是特殊方法 在Python中,特殊方法是以双下划线“__”开头和结尾的方法,也被称为魔术方法,这些方法用于在定义自己的对象时提供特殊的语法支持,例如比较、迭代、属性访问等。 特殊方法实例:__str__方法 __str__方法用于定义对象被打印时的输出内容,对于自定义的类,我们可以根…

    Java 2023年5月26日
    00
  • 使用Spring Data JDBC实现DDD聚合的示例代码

    使用Spring Data JDBC实现DDD聚合的示例代码是一个比较复杂的过程,需要在DDD(领域驱动设计)的思想指导下,设计实现聚合及其关联的实体、值对象等等。以下是一个完整的攻略: 一、设计实体和聚合 首先需要确定需要实现的实体和聚合,并了解其业务含义和关系。 示例一:订单聚合 假设我们设计的一个电商系统,需要实现订单聚合,聚合中包含订单及其关联的商品…

    Java 2023年5月20日
    00
  • Java OOM原因以及解决方案

    Java OOM原因以及解决方案 在Java应用程序运行的过程中,由于程序中申请的内存空间超过了JVM所能提供的内存空间,就会出现OOM(Out of Memory)错误。下面我们将详细讨论OOM的原因、解决方案以及示例说明。 OOM原因 内存泄漏 当一个对象不再被程序使用时,它所占用的内存空间应该被JVM的垃圾回收机制清理掉。但是,如果程序中存在内存泄漏,…

    Java 2023年5月27日
    00
  • Spring AOP定义Before增加实战案例详解

    在Spring应用程序中,我们可以使用AOP(面向切面编程)来实现横切关注点的模块化。在本文中,我们将详细介绍如何使用Spring AOP定义Before增强,并提供两个示例说明。 1. Before增强 Before增强是AOP中的一种通知类型,它在目标方法执行之前执行。我们可以使用@Before注解将一个方法标记为Before增强。下面是一个示例代码: …

    Java 2023年5月18日
    00
  • Maven默认中央仓库(settings.xml 配置详解)

    Maven是一个流行的Java构建工具,它使用中央仓库来管理项目所需的依赖库。在使用Maven时,默认使用中央仓库(Central Repository),本文将介绍如何在settings.xml文件中配置Maven默认中央仓库。 1. settings.xml文件 在Maven中,settings.xml文件用于配置Maven的全局设置(如本地仓库路径、镜…

    Java 2023年5月20日
    00
  • Java实现SHA-1算法实例

    下面是“Java实现SHA-1算法实例”的完整攻略。 简介 SHA-1是一种哈希算法,用于产生消息摘要。它将消息作为输入,输出一个128位(20字节)的消息摘要。它被广泛用于数字签名等领域。 本攻略将介绍如何在Java中实现SHA-1算法,以便在需要时生成文本的消息摘要。 实现步骤 步骤1:导入SHA-1算法库 Java自带了SHA-1算法库,我们只需要导入…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部