Java JDK1.7的LinkedList

Java JDK1.7的LinkedList

@author ixenos

LinkedList



  LinkedList是List接口的双向链表实现,JDK1.7以前是双向循环链表,以后是双向非循环链表;

  由于是链表结构,所以长度没有限制;而且添加/删除元素的时候,只需要改变指针的指向(把链表断开,插入/删除元素,再把链表连起来)即可,非常方便,而ArrayList却需要重整数组 (add/remove中间元素)。所以LinkedList适合用于添加/删除操作频繁的情况

JDK1.7以前 双向循环链表



  在JDK 1.7之前(此处使用JDK1.6来举例),LinkedList是通过headerEntry实现的一个循环链表的:

  1.先初始化一个空的Entry,用来做header,然后首尾相连,形成一个循环链表:

           

1 privatetransient Entry<E>header =new Entry<E>(null,null,null);

2 public LinkedList() {header.next =header.previous =header; } //构造方法先生成一个头结点

2.每次添加/删除元素都是默认在链尾操作:

    

      

  对应此处,就是在header前面操作,因为遍历是next方向的,所以在header前面操作,就相当于在链表尾操作。

  如下面的插入操作addBefore以及图示,如果插入obj_3,只需要修改header.previous和obj_2.next指向obj_3即可:

 1 private Entry<E> addBefore(Eo) {      //取自JDK1.6-LinkedList,有删改
 2
 3     Entry<E>newEntry = new Entry<E>(o,header,header.previous);
 4
 5     newEntry.previous.next = newEntry;
 6
 7     newEntry.next.previous = newEntry;
 8
 9     size++;
10
11     modCount++;
12
13     return newEntry;
14
15 }
16
17  

  • 下面是我之前研究LinkedList源码时做的图片笔记,与以上内容重复,可略过:

___________________________________________________________________________________

JDK1.7 双向非循环链表



  在JDK 1.7,1.6的headerEntry循环链表被替换成了firstEntry和lastEntry组成的非循环链表。

  在初始化的时候,不用去new一个Entry:

1 public LinkedList() { }  

  而是首尾两个Node对象(first、last)放在域中等待实例化,然后用构造器构造出来,而且一开始first的Next指向last,last的Previous指向first(其他null):

  在插入/删除的时候,也是默认在链尾操作。

  把插入的obj当成newLast,挂在oldLast的后面,另外还要先判断first是否为空,如果为空则first = obj。

  如下面的插入方法linkLast,在尾部操作,只需要把obj_3.next指向obj_4即可:

 1 void linkLast(E e) {      //取自JDK1.7-LinkedList,有删改
 2
 3         final Node<E> l = last;
 4
 5         final Node<E> newNode =new Node<>(l, e,null);
 6
 7         last = newNode;
 8
 9         if (l ==null)
10
11             first = newNode;
12
13         else
14
15             l.next = newNode;
16
17         size++;
18
19         modCount++;
20
21 }

对比总结



  JDK 1.7中的first/last对比以前的header有下面几个好处:

  1.first / last有更清晰的链头、链尾概念,代码看起来更容易明白。

  2.first / last方式能节省new一个headerEntry。(实例化headerEntry是为了让后面的方法更加统一,否则会多很多header的空校验)

  3.在链头/尾进行插入/删除操作,first /last方式更加快捷:

    插入/删除操作按照位置,分为两种情况:

          在中间插入/删除,两者都是一样,先遍历找到index,然后修改链表index处两头的指针

          在两头,对于循环链表来说,由于首尾相连,还是需要处理两头的指针。而非循环链表只需要处理一边first.previous/last.next,所以理论上非循环链表更高效

  4.对于遍历来说,两者都是链表指针循环,所以遍历效率是一样的

时间: 2024-08-01 12:10:01

Java JDK1.7的LinkedList的相关文章

Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例 概要  和学习ArrayList一样,接下来呢,我们先对LinkedList有个整体认识,然后再学习它的源码:最后再通过实例来学会使用LinkedList.内容包括:第1部分 LinkedList介绍第2部分 LinkedList数

Java源码之LinkedList

Java源码之LinkedList 转载请注意出处:http://blog.csdn.net/itismelzp/article/details/51620311 一.LinkedList概述 本文采用jdk1.8进行分析. LinkedList实现了List,Deque接口的双向链表,实现了链表的所有可选操作,并且可有null值.查找某个值的时候必须从头到尾的遍历链表.它是非线程安全的,当多个线程结构化修改同一链表时需要加上同步处理.(程结构化修改包括:添加.删除,不包括:修改值)可使用Col

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

Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arraylist和linkedlist的性能. 2,arraylist源代码分析 Arraylist底层的数据结构是一个对象数组.有一个size的成员变量标记数组中元素的个数,例如以下图: * The array buffer into which the elements of the ArrayLis

Eclipse出现了一个找不到java\jdk1.6.0_23\bin\..\jre\bin\client\jvm.dll的错误

昨天打开Eclipse出现了一个找不到java\jdk1.6.0_23\bin\..\jre\bin\client\jvm.dll的错误,不知道所以,然后去这个路径下,发jvm.dll是存在的 然后怀疑是jre和jdk版本冲突的问题,因为机子装了不是一个系统,有32的也是有64的,而且前两天也出现在chrome下找不到java支持的情况,让我装chromejre的插件,丫丫的java的破东西 然后在网上搜问题的解决方案,很少,有两个是让从新安装jdk,然后从装jdk和jre无果,问题依然存在,然

java jdk1.5 对for循环遍历的优化

JDK 1.5对for语句进行了改进,为更好遍历数组,改进后的for语句格式如下:  for(声明循环变量 : 数组名)  { ...  }如:  char b[]={'a','b','c','d'};  for(char ch : b)  {   System.out.println(ch);//打印出数组b中的元素  } 可以方便的实现对list的遍历,很好的简化代码. java jdk1.5 对for循环遍历的优化,布布扣,bubuko.com

Eclipse打开弹出Faied to load the JNI shared library &quot;C:\Program Files(x86)\java\jdk1.6.0_21\bin\..\jre\bin\client“的解决方法

今天下载了一个整合eclipse的安卓ADT,打开弹窗显示”C:\Program Files(x86)\java\jdk1.6.0_21\bin\..\jre\bin\client“ 这个路径很奇怪,于是网上查找了一下资料. 出现Faied to load the JNI shared library这类错误,一般有两种情况: 1,jdk的环境配置有问题 2,jdk与Eclispe的版本不一致(32位/64位) cmd中输入”java -version“能出现java版本信息说明配置是没有问题的

安卓编译出错: Process &#39;command &#39;C:\Java\jdk1.8.0_51\bin\java.exe&#39;&#39; finished with non-zero exit value 1 解决!

安卓编译出错: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit value 1 解决! 刚从eclipse转到Android studio,安装完成之后搭建了系统默认的hello world代码工程,却出现了以下错误: Process 'command 'C:\Java\jdk1.8.0_51\bin\java.exe'' finished with non-zero exit va

JAVA JDK1.5-1.9新特性

JAVA JDK1.5-1.9新特性 1.5 1.自动装箱与拆箱: 2.枚举(常用来设计单例模式) 3.静态导入 4.可变参数 5.内省 1.6 1.Web服务元数据 2.脚本语言支持 3.JTable的排序和过滤 4.更简单,更强大的JAX-WS 5.轻量级Http Server 6.嵌入式数据库 Derby 1.7 1,switch中可以使用字串了 2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断 3.语法上支持集合,而不一定是数组 4

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

Java中arraylist和linkedlist源码分析与性能比较 1,简介 在java开发中比较常用的数据结构是arraylist和linkedlist,本文主要从源码角度分析arraylist和linkedlist的性能. 2,arraylist源码分析 Arraylist底层的数据结构是一个对象数组,有一个size的成员变量标记数组中元素的个数,如下图: * The array buffer into which the elements of the ArrayList are sto