1. transient int size = 0;
  2.  
  3. /**
  4. * Pointer to first node.
  5. * Invariant: (first == null && last == null) ||
  6. * (first.prev == null && first.item != null)
  7. */
  8. transient Node<E> first;
  9.  
  10. /**
  11. * Pointer to last node.
  12. * Invariant: (first == null && last == null) ||
  13. * (last.next == null && last.item != null)
  14. */
  15. transient Node<E> last;
  16.  
  17. /**
  18. * Constructs an empty list.
  19. */
  20. public LinkedList() {
  21. }

LinkedList的属性和构造方法

//添加的方法

  1. public boolean add(E e) {
  2. linkLast(e);
  3. return true;
  4. }
  1. void linkLast(E e) {
  2. final Node<E> l = last;//得到最后一个节点
  3. final Node<E> newNode = new Node<>(l, e, null);//创建一个新节点(他的前一个节点是原集合中的最后一个,元素,他的下一个节点为null)
  4. last = newNode;//将新添加的节点设置为集合的最后一个节点
  5. if (l == null)//集合中原本没有元素,则添加第一个节点
  6. first = newNode;
  7. else
  8. l.next = newNode;//集合中有元素,则将原集合中的最后一个节点的下一个节点设置为新添加的节点
  9. size++;//元素个数+1
  10. modCount++;
  11. }

linkLast的原理是:新添加元素的pre(前一个节点)是原集合中的最后一个元素,新添加元素的next(下一个节点)是null,新添加进来的元素就成了集合的最后一个节点。如果原集合中没有元素(即添加第一个元素),则新添加的元素既是first,也是last.

在不做其他操作(如删除第一个元素,添加第一个元素)时,first就一直是第一个添加的元素,last就是新添加的元素。

  1. private void linkFirst(E e) {
  2. final Node<E> f = first;
  3. final Node<E> newNode = new Node<>(null, e, f);
  4. first = newNode;
  5. if (f == null)
  6. last = newNode;
  7. else
  8. f.prev = newNode;
  9. size++;
  10. modCount++;
  11. }

linkFirst原理:新添加进来的元素成了新集合的第一个元素,新添加元素的pre为null,新添加元素的next为原集合的fist。如果原集合没有元素,那么第一个添加进来的元素既是first也是last。

Node类是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. }

取值:先检查查找的索引是否大于等于0且小于等于集合的长度(size)

  1. public E get(int index) {
  2. checkElementIndex(index);
  3. return node(index).item;
  4. }
  1. /**
  2. * Returns the (non-null) Node at the specified element index.
  3. */
  4. Node<E> node(int index) {
  5. // assert isElementIndex(index);
  6.  
  7. if (index < (size >> 1)) {
  8. Node<E> x = first;
  9. for (int i = 0; i < index; i++)
  10. x = x.next;
  11. return x;
  12. } else {
  13. Node<E> x = last;
  14. for (int i = size - 1; i > index; i--)
  15. x = x.prev;
  16. return x;
  17. }
  18. }

有两种情况的取值,如果查找的索引在集合长度的二分之一前,从前往后查找,否则从后往前查找。如从第一个元素开始,一直first.next.next.next...直到查找的索引为止。从后往前是last.pre.pre.pre....

JDK6和JDK7的实现还是挺不一样的,但是原理是一样的。

JDK7 LinkedList源代码分析的更多相关文章

  1. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  2. 【源代码】LinkedList源代码分析

    //----------------------------------------------------------- 转载请注明出处:http://blog.csdn.net/chdjj by ...

  3. LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  4. Android HttpURLConnection源代码分析

    Android HttpURLConnection源代码分析 之前写过HttpURLConnection与HttpClient的差别及选择.后来又分析了Volley的源代码. 近期又遇到了问题,想在V ...

  5. 第1篇--基于jdk7和jdk8分析 JVM的内存区域

     基于jdk7和jdk8分析 JVM的内存区域 目录前言1.什么是JVM2.JRE/JDK/JVM是什么关系3.JVM执行程序的过程4. JVM的生命周期5.JVM垃圾回收一.运行时数据区的组成1.程 ...

  6. SpringMVC 之类型转换Converter 源代码分析

    SpringMVC 之类型转换Converter 源代码分析 最近研究SpringMVC的类型转换器,在以往我们需要 SpringMVC 为我们自动进行类型转换的时候都是用的PropertyEdito ...

  7. Monkey源代码分析之事件源

    上一篇文章<Monkey源代码分析之执行流程>给出了monkey执行的整个流程.让我们有一个概貌,那么往后的文章我们会尝试进一步的阐述相关的一些知识点. 这里先把整个monkey类的结构图 ...

  8. MapReduce源代码分析之LocatedFileStatusFetcher

    LocatedFileStatusFetcher是MapReduce中一个针对给定输入路径数组,使用配置的线程数目来获取数据块位置的有用类. 它的主要作用就是利用多线程技术.每一个线程相应一个任务.每 ...

  9. android-plugmgr源代码分析

    android-plugmgr是一个Android插件加载框架,它最大的特点就是对插件不需要进行任何约束.关于这个类库的介绍见作者博客,市面上也有一些插件加载框架,但是感觉没有这个好.在这篇文章中,我 ...

随机推荐

  1. [转载]linux下编译php中configure参数具体含义

    编译N次了   原来这么回事 原文地址:linux下编译php中configure参数具体含义作者:捷心特 php编译参数的含义 ./configure –prefix=/usr/local/php ...

  2. Lucene全文检索(一)

    全文检索的概念 1.从大量的信息中快速.准确的查找要的信息2.收索的内容是文本信息3.不是根据语句的意思进行处理的(不处理语义)4.全面.快速.准确是衡量全文检索系统的关键指标.5.搜索时英文不区分大 ...

  3. Jira 6.0.5环境搭建

    敏捷开发-Jira 6.0.5环境搭建[1] 我的环境 Win7 64位,MSSql2008 R2,已经安装tomcat了 拓展环境 jira  6.0.5     百度网盘下载           ...

  4. TCP/IP详解学习笔记- 概述

    TCP/IP详解学习笔记(1)-- 概述1.TCP/IP的分层结构      网络协议通常分不同层次进行开发,每一层分别负责不同的同信功能.TCP/IP通常被认为是一个四层协议系统.      如图所 ...

  5. 性能测试工具比较:LoadRunner vs JMeter - 测试结果数据比较

    对web请求(HTTP/HTML)进行性能测试,确认请求响应时间.分别使用Loadrunner和JMeter进行测试,比较测试结果. 1.LoadRunner测试web请求响应时间 1.1  编制(录 ...

  6. c# winform 在一个窗体中使用另一个窗体中TextBox控件的值——解决办法

    [前提]一个winform应用程序项目中,窗体B,需要使用 窗体A 中一个TextBox控件的值,进行计算等操作. [解决方案] 1.在窗体A中定义:public static double a;// ...

  7. MacOSX 中如何动态隐藏Dock Icon

    XCode创建了一个GUI工程,程序分几种运行模式,一种是agent模式,还有一种是GUI界面.Agent模式是没有界面的GUI程序,通过LaunchAgents启动.创建出来的Info.plist默 ...

  8. Coursera Machine Leaning 课程总结

    最近机器学习比较火热,身边很多同学都有兴趣,恰好Coursera上面有这门课.讲授这门课的Andrew教授任职斯坦福大学,是coursera的联合创建者,在机器学习领域颇有成就,身边的同学也有几位上这 ...

  9. Java的Exception和Error面试题10问10答

    在Java核心知识的面试中,你总能碰到关于 处理Exception和Error的面试题.Exception处理是Java应用开发中一个非常重要的方面,也是编写强健而稳定的Java程序的关键,这自然使它 ...

  10. Nutz中过滤特殊字符

    ##Servlet中有获取Request参数的方法,而Nutz中也有重写类似的方法,我们只要知道它如何得到RequestMap就可以处理请求中的参数,进而对它进行处理. 在Nutz项目中的MainMo ...