java基础-Java集合框架-Collection子接口-LinkedList的源码分析
发布日期:2021-04-30 21:02:50 浏览次数:83 分类:精选文章

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

Java集合框架-Collection子接口之一-List接口-LinkedList源码分析

LinkedList类概述

LinkedList是Java集合框架中List接口的一个实现类,属于Collection子接口的一部分。它采用双向链表的结构,内部没有使用数组来存储元素,而是通过定义内部类Node来实现元素的存储。每个Node节点包含三个成员变量:item用于存储元素的值,next用于指向下一个节点,prev用于指向前一个节点。Node类通过构造函数接受这三个参数并赋值给自身成员变量。

Node类的定义

private static class Node {    E item;    Node next;    Node prev;    Node(Node prev, E element, Node next) {        this.item = element;        this.next = next;        this.prev = prev;    }}

Node类的构造函数接受三个参数:前一个节点(prev)、当前节点的元素(element)和下一个节点(next)。然后将这三个参数分别赋值给自身的previtemnext成员变量。Node类是LinkedList中存储元素的基本结构单元。

LinkedList的构造器

LinkedList类有两个构造器:

  • 公默认构造器:

    public LinkedList() {}

    这个构造器不初始化任何内容,仅初始化成员变量size为0。

  • 接受Collection参数的构造器:

    public LinkedList(Collection
    c) { this(); addAll(c);}

    这个构造器接受一个Collection对象c,将其内容添加到LinkedList中。它首先调用自身的构造器,然后调用addAll方法将c中的所有元素添加到LinkedList中。

  • 添加元素的方法

    添加元素的方法add(E e)调用linkLast(E e)来执行尾插法操作。linkLast方法的实现步骤如下:

  • 获取当前链表的末尾节点l。
  • 创建一个新的Node对象 newNode,参数分别为当前末尾节点l、要添加的元素e,以及null(表示新节点的下一个节点为空)。
  • 将新节点赋值给LinkedList的last属性。
  • 检查当前末尾节点l是否为空:
    • 如果为空(说明新节点是第一个节点),则将LinkedList的first属性赋值为新节点。
    • 如果不为空,则将当前末尾节点l的next属性赋值为新节点。
  • 增加链表的大小size
  • 增加操作计数器modCount
  • public boolean add(E e) {    linkLast(e);    return true;}void linkLast(E e) {    final Node l = last;    final Node newNode = new Node(l, e, null);    last = newNode;    if (l == null) {        first = newNode;    } else {        l.next = newNode;    }    size++;    modCount++;}

    总结

    LinkedList类通过双向链表的结构实现了List接口的功能。其内部使用Node类作为存储单元,每个Node节点包含一个元素以及指向前后节点的指针。添加元素时采用尾插法,插入新节点到链表末尾,调整首尾指针和相邻节点的指针。由于 LinkedList采用链表结构,其在进行插入和删除操作时时间复杂度为O(1),但在处理链表断裂(如删除中间节点)时需要额外的操作,可能导致性能上的损耗。

    通过构造器接受Collection参数,用户可以将已有的Collection对象直接添加到LinkedList中,简化了初始化过程。这种设计使得LinkedList在某些场景下更加灵活和便捷。

    上一篇:String类的API
    下一篇:题目 1122: [C语言训练]亲密数 题解

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2026年05月31日 22时38分31秒