Java集合3-LinkedList

介绍

LinkedList是一种双向链表数据结构,实现了 List 接口。具有

LinkedList底层由一系列节点组成,每个节点包含了对前一个节点和后一个节点的引用。这种结构允许在链表中高效地插入和删除元素,因为不需要像数组那样移动元素。每个节点通常会包含一个数据元素。

新增

java 复制代码
  public boolean add(E e) {
        linkLast(e);
        return true;
    }
     /**
     * Links e as last element.
     */
    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++;
        modCount++;
    }

可见每次插入都是移动节点,和 ArrayList 的拷贝数组来说效率要高上不少

结构

LinkedList的节点由Node类实现,它通常是一个私有内部类。Node类通常包含三个字段:item用于存储数据元素,prev用于指向前一个节点,next用于指向后一个节点。

LinkedList还包含指向链表头部和尾部的引用。这些引用使得在链表的开头和末尾进行操作更加高效。

LinkedList不支持通过索引直接访问元素。要访问特定位置的元素,必须从头节点或尾节点开始遍历列表,直到找到所需位置的元素。因此,索引访问的时间复杂度是O(n),其中n是列表的长度。

查询方法

java 复制代码
    public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }
    
    Node<E> node(int index) {
        // assert isElementIndex(index);

        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

上述代码,利用了双向链表的特性,如果index离链表头比较近,就从节点头部遍历。否则就从节点尾部开始遍历。使用空间(双向链表)来换取时间。

迭代器LinkedList实现了java.util.List接口,因此支持使用迭代器进行遍历操作。迭代器在LinkedList中的实现是双向的,因此可以在任一方向上进行迭代,使得在列表中移动元素非常高效。

线程不安全LinkedList的实现不是线程安全的,如果需要在多线程环境下使用,需要手动保证同步。

相关推荐
鹿角片ljp2 小时前
KV Cache 解析
java·算法
captain3762 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
惊讶的猫3 小时前
意图识别置信度和检索重排的分数
java
2601_966949653 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
caoerzhong3 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
m0_734571763 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
程序员JerrySUN3 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
Joy T4 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者4 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘