LinkedList的数据结构就是双向链表,如下所示:

  1. private static class Node<E> {
  2. E item;//数据元素
  3. Node<E> next;//后继节点
  4. Node<E> prev;//前驱节点
  5.  
  6. Node(Node<E> prev, E element, Node<E> next) {
  7. this.item = element;
  8. this.next = next;
  9. this.prev = prev;
  10. }
  11. }

构造器:

  1. transient int size = ;//数据个数
  2. transient Node<E> first;//表示链表的第一个节点
  3. transient Node<E> last;//表示链表的最后一个节点
  4.  
  5. public LinkedList() {
  6. }
  7.  
  8. public LinkedList(Collection<? extends E> c) {//用于整合Collection类型的数据
  9. this();
  10. addAll(c);
  11. }

add:

  1. public boolean add(E e) {
  2. linkLast(e);
  3. return true;
  4. }
  5.  
  6. void linkLast(E e) {//采用的是尾插法
  7. final Node<E> l = last;
  8. final Node<E> newNode = new Node<>(l, e, null);//新节点的前驱指向last的地址,后继为null,
                                    //所以说这是一个双向链表,但不是循环的,循环的话,后继指向头节点
  9. last = newNode;//让last指向新节点,也就说这个新节点是链表的最后一个元素
  10. if (l == null)//当第一次添加时,first,last都是null,如果last是null,表明这是一个空链表
  11. first = newNode;//就让新节点指向first,现在first和last都是同一个节点
  12. else
  13. l.next = newNode;//当在添加数据时,就让老链表的最后一个节点的后继指向新节点(那个节点本来是null的)
  14. size++; //长度加1
  15. modCount++;
    /**
    总结:
    新建一个节点,让新节点的前驱指向老链表的最后一个节点
    让老链表的最后一个节点的后继指向新节点
    让新节点变成链表的最后一个节点
    长度加1
    第一个节点前驱为null,最后一个节点后继为null
  16.  
  17. */
  18. }

get:

  1. public E get(int index) {
  2. checkElementIndex(index);//检查一下索引是否在0到size的范围内
  3. return node(index).item;
  4. }
  5.  
  6. Node<E> node(int index) {
  7. // assert isElementIndex(index);
  8.  
  9. if (index < (size >> )) {//看看索引的位置是在链表的前半部分还是后半部分,决定正着搜索或倒着搜索,找到后返回就行啦
  10. Node<E> x = first;
  11. for (int i = ; i < index; i++)//在这里看到链表是从0开始的
  12. x = x.next;
  13. return x;
  14. } else {
  15. Node<E> x = last;
  16. for (int i = size - ; i > index; i--)
  17. x = x.prev;
  18. return x;
  19. }
  20. }

remove:

  1. public E remove(int index) {
  2. checkElementIndex(index);//先检查一下索引
  3. return unlink(node(index));
  4. }
  5. //先拿着索引找到这个节点
  6. E unlink(Node<E> x) {
  7. // assert x != null;
  8. final E element = x.item;//节点的元素
  9. final Node<E> next = x.next;//节点的后继
  10. final Node<E> prev = x.prev;//节点的前驱
  11.  
  12. if (prev == null) {
  13. first = next;
  14. } else {
  15. prev.next = next;
  16. x.prev = null;
  17. }
  18.  
  19. if (next == null) {
  20. last = prev;
  21. } else {
  22. next.prev = prev;
  23. x.next = null;
  24. }
  25.  
  26. x.item = null;
  27. size--;
  28. modCount++;
  29. return element;
  30. }

LinkedList<E>源码分析的更多相关文章

  1. LinkedList 的源码分析

    LinkedList是基于双向链表数据结构来存储数据的,以下是对LinkedList  的 属性,构造器 ,add(E e),remove(index),get(Index),set(inde,e)进 ...

  2. LinkedList的源码分析

    1. LinkedList的定义  1.1  继承于AbstractSequentialList的双向链表,可以被当作堆栈.队列或双端队列进行操作 1.2  有序,非线程安全的双向链表,默认使用尾部插 ...

  3. Java的LinkedList底层源码分析

    首先我们先说一下,源码里可以看出此类不仅仅用双向链表实现了队列数据结构的功能,还提供了链表数据结构的功能.

  4. LinkedList的源码分析(基于jdk1.8)

    1.初始化 public LinkedList() { } 并未开辟任何类似于数组一样的存储空间,那么链表是如何存储元素的呢? 2.Node类型 存储到链表中的元素会被封装为一个Node类型的结点.并 ...

  5. Java——LinkedList底层源码分析

    1.简介 LinkedList 是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢.另外,他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈 ...

  6. 集合框架——LinkedList集合源码分析

    目录 示例代码 底层代码 第1步(初始化集合) 第2步(往集合中添加一个元素) 第3步(往集合中添加第二个元素) 第4步(往集合中添加第三个元素) LinkedList添加元素流程示意图 第5步(删除 ...

  7. 集合之LinkedList(含JDK1.8源码分析)

    一.前言 LinkedList是基于链表实现的,所以先讲解一下什么是链表.链表原先是C/C++的概念,是一种线性的存储结构,意思是将要存储的数据存在一个存储单元里面,这个存储单元里面除了存放有待存储的 ...

  8. LinkedList源码分析和实例应用

    1. LinkedList介绍 LinkedList是继承于AbstractSequentialList抽象类,它也可以被当作堆栈.队列或者双端队列使用. LinkedList实现了Deque接口,即 ...

  9. [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!

    文章已经收录在 Github.com/niumoo/JavaNotes ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教. 欢迎关注我的公众号,文章每周更新. 前言 说真的,在 Jav ...

随机推荐

  1. sql无限递归查询

    --------------所有子集数据包括自己--------------------- CREATE PROCEDURE ALLSON @ID INT AS BEGIN WITH CTE AS ( ...

  2. 深入理解Sqlserver文件存储之页和应用 (转)

    我们每天都在使用数据库,我们部门使用最多的关系数据库有Sqlserver,Oracle,有没有想过这些数据库是怎么存放到操作系统的文件中的?有时候为了能够设计出最优的表结构,写出高性能的Sqlserv ...

  3. OCP考点实战演练02-日常维护篇

    本系列宗旨:真正掌握OCP考试中所考察的技能,坚决不做Paper OCP! 实验环境:RHEL 6.4 + Oracle 11.2.0.4 OCP考点实战演练02-日常维护篇 1.数据库体系结构和AS ...

  4. 读书笔记--SQL必知必会18--视图

    读书笔记--SQL必知必会18--视图 18.1 视图 视图是虚拟的表,只包含使用时动态检索数据的查询. 也就是说作为视图,它不包含任何列和数据,包含的是一个查询. 18.1.1 为什么使用视图 重用 ...

  5. 【知识积累】try-catch-finally+return总结

    一.前言 对于找Java相关工作的读者而言,在笔试中肯定免不了遇到try-catch-finally + return的题型,需要面试这清楚返回值,这也是这篇博文产生的由来.本文将从字节码层面来解释为 ...

  6. linux内核数据结构之kfifo

    1.前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的.缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度.例如一个进程A产 ...

  7. WPF入门:XAML

    XAML是WPF技术中专门用于设计UI的语言 XAML优点最大的优点是将UI与逻辑代码剥离 创建第一个WPF应用程序 VS默认生成的WPF项目解决方案 Properties:里面主要包含了程序用到的一 ...

  8. C#中HttpClient使用注意:预热与长连接

    最近在测试一个第三方API,准备集成在我们的网站应用中.API的调用使用的是.NET中的HttpClient,由于这个API会在关键业务中用到,对调用API的整体响应速度有严格要求,所以对HttpCl ...

  9. C# Linq排序

    今天在家看了一下linq,实践了一下书中代码,发现排序和查重的先后顺序太重要了. using System; using System.Collections.Generic; using Syste ...

  10. Android Service

    一.在MainAcitivity界面启动Service  : public class MyService extends Service intent = new Intent(MainActivi ...