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日

相关文章

  • Java反射概念与使用实例代码

    Java反射是Java语言自带的一种强大的机制,允许在运行时动态地获取类的信息、访问或修改类的属性和方法等。本文将详细讲解Java反射的概念和使用,包含以下内容: 反射概述 反射实现方式 反射的作用与优缺点 反射使用的实例代码 反射概述 Java反射(Reflection)是Java语言中的一种机制。它可以让我们在运行时动态地获取类的信息、访问或修改类的属性…

    Java 2023年5月30日
    00
  • JAVA中的for循环几种使用方法讲解

    JAVA中的for循环几种使用方法讲解 在Java中,for循环是最常用的循环结构之一。它可以重复执行代码块,根据不同的循环条件可以有多种使用方式。 基本的for循环 最基本的for循环有三个部分,分别是循环变量初始化、循环条件和循环变量的更新。语法如下: for (循环变量初始化; 循环条件; 循环变量的更新) { // 循环体代码块 } 其中,循环变量初…

    Java 2023年5月26日
    00
  • 使用kotlin集成springboot开发的超详细教程

    让我们来详细讲解一下如何使用Kotlin集成SpringBoot进行开发的完整攻略。 第一步:创建SpringBoot项目 首先,我们需要创建一个SpringBoot项目。可以使用SpringBoot的初始化器或者使用Spring Initializer来创建一个基本的SpringBoot项目。 $ curl https://start.spring.io/…

    Java 2023年5月15日
    00
  • Java语言实现快速幂取模算法详解

    Java语言实现快速幂取模算法详解 在进行大数据处理时,经常需要对数据进行取余操作。如果数据太大,直接进行取余运算会导致内存溢出等问题,因此需要使用快速幂取模算法来解决这个问题。本文将详细讲解Java语言如何实现快速幂取模算法。 快速幂取模原理 快速幂取模算法是对普通的取模操作进行优化,将原始数据不断倍增,取余操作则只在最后一次进行。其核心原理为二分思想,即…

    Java 2023年5月26日
    00
  • 从Java的jar文件中读取数据的方法

    从Java的jar文件中读取数据有多种方法,这里提供两个示例: 1. 使用Java自带的类库 Java中有自带的读取jar包中文件的方法,可以使用java.util.jar.JarFile类,在该类中提供了多个方法可以读取jar文件中的内容,例如下面的示例代码: import java.io.IOException; import java.io.Input…

    Java 2023年5月20日
    00
  • JDBC连接SQL Server数据库实现增删改查的全过程

    JDBC(Java DataBase Connectivity)是Java语言中连接数据库进行操作的一种标准规范。下面是连接SQL Server数据库实现增删改查的全过程: 准备工作 安装SQL Server数据库,获取数据库的连接配置信息,包括地址、用户名、密码、端口等信息。 下载并安装SQL Server JDBC驱动,下载地址:https://docs…

    Java 2023年5月19日
    00
  • 详细理解JAVA面向对象的封装,继承,多态,抽象

    JAVA面向对象的基本概念 在Java中,“一切皆对象”,Java程序就是通过面向对象的编程思想来实现的。面向对象的编程思想的核心概念主要包括封装、继承、多态和抽象。这些概念描述了Java对象与类之间的关系和相互作用。 封装 封装是指将数据和行为包装在一起,形成一个类。封装的主要目的是隐藏类的实现细节,只对外部暴露必要的接口,从而达到数据的安全性。 在Jav…

    Java 2023年5月26日
    00
  • Java内嵌的作用是什么?

    Java内嵌指的是在一个Java程序中嵌入其他语言的代码或脚本执行。Java内嵌的作用主要包括: 可以让Java程序具有更高的灵活性和扩展性,可通过与其他语言的混合编程实现Java程序的定制化需求; 可以利用其他语言的特性和库,快速地实现某些复杂的功能。 下面通过两个示例来说明Java内嵌的具体使用方法。 示例1:Java内嵌Python脚本 Java内置了…

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