JAVA集合源码分析系列:LinkedList源码分析

本文深入分析了LinkedList的内部实现机制,介绍了其作为双向链表的特点和优势,包括添加和删除操作的高效性,以及实现原理的详细解读。

LinkedList源码分析

一.LinkedList简介

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
LinkedList 实现 List 接口,能对它进行队列操作。
LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。
LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。
LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
LinkedList 是非同步的。

二.LinkedList源码分析

LinkedList的本质是双向链表。
(01) LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。
(02) LinkedList包含两个重要的成员:header 和 size。
header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。
size是双向链表中节点的个数。
  
双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。注意LinkedList的内部不是循环的。

1.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;
        }
    }

这是一个节点对应的类,其中可看到有一个元素、该节点的前驱、该节点的后继三个成员。

2.add方法


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

add方法其实是在链表的最后又添加了一个元素。我们可以看一下linkLast的源码:

 /**
     * 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++;
    }

大致意思就是在链表的尾部再增加一个元素。

三.总结

大学的时候学习的《数据结构》又派上用场了,通过上面的分析,我们知道LinkedList的内部实现是双向链表,优点是:增加删除方便,但是取值比较慢,正好和ArrayList相反。请选择合适的尝试使用合适的数据结构。

参考资料

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例
http://www.cnblogs.com/skywang12345/p/3308807.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值