关闭

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

442人阅读 评论(0) 收藏 举报
分类:

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

0
0
查看评论

Java进阶之----LinkedList源码分析

今天在看LinkedList的源代码的时候,遇到了一个坑。我研究源码时,发现LinkedList是一个直线型的链表结构,但是我在baidu搜索资料的时候,关于这部分的源码解析,全部都说LinkedList是一个环形链表结构。。我纠结了好长时间,还以为我理解错了,最后还是在Google搜到了结果:因为...
  • zw0283
  • zw0283
  • 2016-04-12 14:39
  • 5619

JDK 1.7源码阅读笔记(三)集合类之LinkedList

前言  (1)LinkedList的内部实现是双向链表,继承了AbstractSequentialList,实现了List, Deque, Cloneable, java.io.Serializable接口,因此LinkdeList本身支持就支持双端队列操作。LinkedList**允许所有元素(包...
  • longlong2015
  • longlong2015
  • 2015-09-02 09:58
  • 976

LinkedList源码分析(基于JDK8)

LinkedList简介 LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 LinkedList 实现 List 接口,能对它进行队列操作。 LinkedList 实现 Deque 接口,即能将LinkedList...
  • fighterandknight
  • fighterandknight
  • 2017-03-12 17:36
  • 1506

Java之LinkedList源码解读(JDK 1.8)

java.util.LinkedList     双向链表实现的List。    基于JDK 1.8。    没有使用标准的注释,并适当调整了代码的缩进以方便介绍。    里面很多方法的实现是一样的,不过可以让外界感觉...
  • anxpp
  • anxpp
  • 2016-04-20 19:57
  • 6933

Java集合框架之List---ArrayList与LinkedList源码分析

一、 ArrayList概述: ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。   ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedL...
  • oChangWen
  • oChangWen
  • 2016-01-26 13:51
  • 3443

Java中arraylist和linkedlist源码分析与性能比较

Java中arraylist和linkedlist源码分析与性能比较 1,简介 在java开发中比较常用的数据结构是arraylist和linkedlist,本文主要从源码角度分析arraylist和linkedlist的性能。 2,arraylist源码分析   ...
  • weibin_6388
  • weibin_6388
  • 2016-04-05 14:17
  • 620

Java集合源码分析→LinkedList

LinkedList是基于双向循环链表实现的,除了可以当链表来操作外,还可以当作栈、队列和双向队列来使用 LinkedList同样是非线程安全的,只在单线程下适用;LinkedList实现了Serializable 接口表面可以进行序列化传输,还实现了Cloneable 接口,表示能被克隆
  • qq455276333
  • qq455276333
  • 2017-08-21 21:47
  • 264

java集合框架03——ArrayList和源码分析

上一章学习了Collection的架构,并阅读了部分源码,这一章开始,我们将对Collection的具体实现进行详细学习。首先学习List。而ArrayList又是List中最为常用的,因此本章先学习ArrayList。先对ArrayList有个整体的认识,然后学习它的源码,深入剖析ArrayLis...
  • eson_15
  • eson_15
  • 2016-04-11 15:05
  • 3348

【java集合】LinkedList源码分析

LinkedList是一种基于链表实现的集合类,也是经常使用到的集合。其特性归纳如下: 特性 值 是否顺序存储 顺序 是否可重复存储 可以 是否可存储null 可以 是否线程安全 非线程安全 LinkedList的属性首先列举一下ArrayList主要属性,方便...
  • gagewang1
  • gagewang1
  • 2017-11-12 21:39
  • 57

java源码分析之集合框架 ArrayList和LinkedList的区别05

List概括 先来回顾一下List在Collection中的的框架图: 从图中我们可以看出: 1. List是一个接口,它继承与Collection接口,代表有序的队列。 2. AbstractList是一个抽象类,它继承于AbstractCo...
  • wangnanwlw
  • wangnanwlw
  • 2016-08-17 13:35
  • 609
    写给自己
    ○ 种一棵树最好的时间是十年前,其次是现在

    ○ 坚持输出,坚持书写,才可以持续成长

    ○ 所有美好事物的成长都是缓慢的

    ○ 既往不恋,未来不迎,当下不杂

    ○ 业精于勤,荒于嬉,行成于思,毁于随

    ○将军赶路 不追小兔

    ○不要拘泥于语言,同样也不要拘泥于行业,眼光放远一点

    ○ 如果某件事你做的不够好,不必介怀,因为以后的每一次每一天你都会做得越来越好

    ○ 此心不于事上磨,更于何处磨此心

    ○ 保持热情,保持求知欲

    ○ 千里之行,始于足下

    ○ 最怕你一生碌碌无为,还安慰自己平凡可贵。

    ○ 对于任何事,要保持自觉积极主动探索尝试。但是如果自己不积极认真地生活,不管得到什么样的回答都没有用。——解忧杂货店
    个人资料
    • 访问:698540次
    • 积分:7200
    • 等级:
    • 排名:第3736名
    • 原创:299篇
    • 转载:53篇
    • 译文:0篇
    • 评论:122条
    个人简介