在Java中,LinkedList泛型类继承了AbstractSequentialListf泛型类,实现了List、Deque、Colneable和Serializable接口,定义如下:

该类的实现使用的是循环链表的结构,我们知道,一个链表的主要标志就是表头,所以一个LinkedList泛型类中一定要有一个头结点,链表的组成元素是结点,所以还需要在该类中定义一个结点的内部类,当然,也可以在外面定义,为了实现更好的封装性,定义成private的内部类是再好不过的了。

下面是定义的头结点和内部结点类:

private transient Entry<E> header = new Entry<E>(null, null, null); private transient int size = 0;

在定义header的时候,使用了一个transient修饰符,在Java中,被该修饰符修饰的变量在串行化的时候(序列化)的时候,不会序列化该变量。因为一个链表,如果需要串行化,我们需要的信息只是结点中的信息,所以头结点可以定义成一个被transient修饰的变量。同时还定义了一个size变量,用来保存链表的长度,同样,它也应该使用transient修饰符。

下面是定义的结点类Entry类:

private static class Entry<E> { E element; Entry<E> next; Entry<E> previous; Entry(E element, Entry<E> next, Entry<E> previous) { this.element = element; this.next = next; this.previous = previous; } }

一个结点除了要保存数据之外,还应该保存它的后继(单项链表),由于该类提供一些操作,需要向前遍历,所以还需要有一个保存前驱的信息,即privious引用。

下面是LinkedList泛型类中的listIterator()方法:

public ListIterator<E> listIterator() {   return listIterator(0);     } public ListIterator<E> listIterator(int index) { return new ListItr(index); } private class ListItr implements ListIterator<E> { private Entry<E> lastReturned = header; private Entry<E> next; private int nextIndex; private int expectedModCount = modCount; ListItr(int index) { if (index < 0 || index > size) throw new IndexOutOfBoundsException("Index: "+index+ ", Size: "+size); if (index < (size >> 1)) { next = header.next; for (nextIndex=0; nextIndex<index; nextIndex++) next = next.next; } else { next = header; for (nextIndex=size; nextIndex>index; nextIndex--) next = next.previous; } } public boolean hasNext() { return nextIndex != size; } public E next() { checkForComodification(); if (nextIndex == size) throw new NoSuchElementException(); lastReturned = next; next = next.next; nextIndex++; return lastReturned.element; } public boolean hasPrevious() { return nextIndex != 0; } public E previous() { if (nextIndex == 0) throw new NoSuchElementException(); lastReturned = next = next.previous; nextIndex--; checkForComodification(); return lastReturned.element; } public int nextIndex() { return nextIndex; } public int previousIndex() { return nextIndex-1; } public void remove() { checkForComodification(); Entry<E> lastNext = lastReturned.next; try { LinkedList.this.remove(lastReturned); } catch (NoSuchElementException e) { throw new IllegalStateException(); } if (next==lastReturned) next = lastNext; else nextIndex--; lastReturned = header; expectedModCount++; } public void set(E e) { if (lastReturned == header) throw new IllegalStateException(); checkForComodification(); lastReturned.element = e; } public void add(E e) { checkForComodification(); lastReturned = header; addBefore(e, next); nextIndex++; expectedModCount++; } final void checkForComodification() { if (modCount != expectedModCount) throw new ConcurrentModificationException(); } }

还有一些操作,主要是对引用的修改。在此不一一列出了。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/04/10/2510091.html

深度剖析Java数据结构之表(四)——LinkedList泛型类的实现相关推荐

  1. 深度剖析Java数据结构之表(三)——ArrayList泛型类的实现

    为了避免与类库中的ArrayList类重复,在这里,使用的类名为ArrayListDemo.在Java中,ArrayList泛型类是继承AbstractList泛型类的,并且实现了List<E& ...

  2. 深度剖析Java数据结构之表(二)——List接口

    一.List接口 在Java中,List接口的定义如下: public interface List<E> extends Collection<E> { int size() ...

  3. 深度剖析Java数据结构之迭代器(Iterator)

    一.什么是迭代器 我们知道,JVM是用C/C++编写的.在百度百科中,迭代器是解释是迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定 ...

  4. 深度剖析Java数据结构之队列(一)——双端队列(ArrayDeque)

    一.队列 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. ...

  5. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

  6. JAVA数据结构 线性表的链式存储及其实现

    2019独角兽企业重金招聘Python工程师标准>>> 2线性表的链式存储及其实现 虽然顺序表具有随机存取的特点是一种有用的存储结构但是也有缺陷: (1)      若需要给顺序表增 ...

  7. arraylist转int数组_深度剖析Java集合之ArrayList

    一. ArrayList 初识 ArrayList是集合的一种实现,实现了接口List,List接口继承了Collection接口. ArrayList 是java 中最常用的集合类型,这是因为它使用 ...

  8. 数据结构特性解析 (四)LinkedList

    描述 LinkedList应该也是开发中比较常用的数据结构了,其基于链表数据结构实现,添加和删除效率相对比较高,而随机访问效率偏低 特点 1.LinkedList是双向不循环链表 通过查看链节点类: ...

  9. Java数据结构--有序表

    Predecessor interface /*** Created by root on 16-3-4.*/ public interface Predecessor<E> {publi ...

最新文章

  1. Transformer深至1000层还能稳定训练,微软实习生一作,LSTM之父转发
  2. 在路上---一个平凡人的2015年总结及2016年展望
  3. jsjavaScript打印99乘法表
  4. 天涯明月刀ol最新服务器列表,天涯明月刀手游开服表 新区开服时间表汇总[多图]...
  5. Linux - Yocto: 创建toolchain
  6. 传智播客8月C/C++基础班开班
  7. 如何打开mo文件并修改 PoEdit
  8. 基于原生Wine6.0.2稳定版打补丁解决ukylin-wine图标显示异常和deepin-wine闪退的问题,Ubuntu运行QQ接近完美(附补丁)。
  9. 微信趣味地区一键设置,安排
  10. 外汇基础知识学习3--平仓
  11. 深入理解Java虚拟机到底是什么
  12. 如何多人共同编辑_微信编辑器可以多人协作排版吗?
  13. element-ui 上传图片,图片404
  14. 计算机组成原理-流水线技术学习笔记1
  15. 人脸识别系列(十五):COCO Loss
  16. 51单片机c语言工作手册,51单片机C语言编程手册
  17. 2022-2028年全球植入前基因检测收入年复合增长率CAGR为 5.6%
  18. Beacon学习总结
  19. 2019年8月8日星期四(系统编程)
  20. 强大的UI编辑器-FairyGui简单介绍

热门文章

  1. 服务应用监控健康检测
  2. httpclient+Jsoup总结
  3. 百度地图API的第一次接触——右键菜单
  4. Excel 二次开发系列(3): 创建Excel二次开发环境
  5. 《设计模式详解》笔记目录
  6. 小程序入门学习05--幻灯片、页面生命周期
  7. 【渗透测试实战】PHP语言有哪些后门?以及利用方法
  8. Linux操作Oracle(3)——Oracle OPatch打补丁遇到问题详细汇总详细记录
  9. sqlserver命令行修改用户登录密码
  10. 样式中指定调用的效果