Java LinkedList的ListIterator

Java LinkedList的ListIterator

@author ixenos

ListIterator<E>是继承自Iterator<E>的接口



  故,ListIterator注意点:

  1.迭代器不存储所有元素的引用,只有两个指针,一个指向上一个返回得到的元素,另一个下一个未涉足的元素;

  2.迭代开始前先同步内外modCount,迭代过程中检查是否同步,如果外部结构改变,则迭代快速失败(fast-fails机制);

  3.ListIterator可以算半个LinkedList视图了,因为在迭代的途中还可以修改外部结构(add、remove)

listIterator(int index)源码分析


listIterator

public ListIterator<E> listIterator(int index)
返回此列表中的元素的列表迭代器(按适当顺序),从列表中指定位置开始
参数:
index - 要从列表迭代器返回的第一个元素的索引(通过调用 next 方法)
返回:
此列表中的元素的 ListIterator(按适当顺序),从列表中指定位置开始
抛出:
IndexOutOfBoundsException - 如果索引超出范围 (index < 0 || index > size())
通过:
   内部类private class ListItr implements ListIterator<E> 实现

  1 //迭代器不存储数值!是每迭代一次返回一次
  2 // LinkedList中功能强大的ListIterator方法
  3
  4   public ListIterator<E> listIterator(int index) {
  5         checkPositionIndex(index);
  6         return new ListItr(index);  //调用内部类ListItr的匿名对象
  7     }
  8
  9 //把ListIterator接口送给内部类实现是为了与Iterator接口兼容,因为ListIterator接口继承自Iterator接口
 10     private class ListItr implements ListIterator<E> { //实现了ListIterator接口
 11         private Node<E> lastReturned; //指向上一个返回得到的元素
 12         private Node<E> next; //指向下一个未涉足的元素
 13         private int nextIndex;
 14         private int expectedModCount = modCount;
 15
 16         ListItr(int index) {
 17             // assert isPositionIndex(index);
 18             next = (index == size) ? null : node(index);
 19             nextIndex = index;
 20         }
 21
 22         public boolean hasNext() {
 23             return nextIndex < size;
 24         }
 25
 26         public E next() {
 27             checkForComodification();
 28             if (!hasNext())
 29                 throw new NoSuchElementException();
 30
 31             lastReturned = next;
 32             next = next.next;
 33             nextIndex++;
 34             return lastReturned.item;
 35         }
 36
 37         public boolean hasPrevious() {
 38             return nextIndex > 0;
 39         }
 40
 41         public E previous() {
 42             checkForComodification();
 43             if (!hasPrevious())
 44                 throw new NoSuchElementException();
 45
 46             lastReturned = next = (next == null) ? last : next.prev;
 47             nextIndex--;
 48             return lastReturned.item;
 49         }
 50
 51         public int nextIndex() {
 52             return nextIndex;
 53         }
 54
 55         public int previousIndex() {
 56             return nextIndex - 1;
 57         }
 58
 59 //可以删除哟
 60         public void remove() {
 61             checkForComodification();     //先确定外部modCount没变
 62             if (lastReturned == null)
 63                 throw new IllegalStateException();
 64
 65             Node<E> lastNext = lastReturned.next;
 66             unlink(lastReturned);
 67             if (next == lastReturned)
 68                 next = lastNext;
 69             else
 70                 nextIndex--;
 71             lastReturned = null;
 72             expectedModCount++;    //删除外部元素modCount++所以内部的expectedModCount也++来同步
 73         }
 74
 75         public void set(E e) {
 76             if (lastReturned == null) //先确定外部modCount没变
 77                 throw new IllegalStateException();
 78             checkForComodification();
 79             lastReturned.item = e;
 80         }
 81
 82         public void add(E e) {
 83             checkForComodification();
 84             lastReturned = null;
 85             if (next == null)
 86                 linkLast(e); //如果next指针在队尾则直接加在队尾
 87             else
 88                 linkBefore(e, next); //否则插入到next指针指向元素的前面
 89             nextIndex++;
 90             expectedModCount++; //删除外部元素modCount++所以内部的expectedModCount也++来同步
 91
 92         }
 93
 94         public void forEachRemaining(Consumer<? super E> action) {
 95             Objects.requireNonNull(action);  //如果action为空则抛出空指针异常
 96             while (modCount == expectedModCount && nextIndex < size) {
 97                 action.accept(next.item);
 98                 lastReturned = next;
 99                 next = next.next;
100                 nextIndex++;
101             }
102             checkForComodification();
103         }
104
105 //外部结构修改则迭代快速失败fast-fails
106         final void checkForComodification() {
107             if (modCount != expectedModCount)
108                 throw new ConcurrentModificationException();
109         }
110 }

listIterator源码

利用ListItr实现的降序迭代


descendingIterator

public Iterator<E> descendingIterator()
返回以逆向顺序在此双端队列的元素上进行迭代的迭代器。元素将按从最后一个(尾部)到第一个(头部)的顺序返回。
实质就是在关键操作修改了指针
返回:
以逆向顺序在此双端队列中的元素上进行迭代的迭代器
从以下版本开始:
1.6 

 1   /**降序迭代
 2      * @since 1.6
 3      */
 4 // sort 是顺序ascending 表示升descending 表示降
 5     public Iterator<E> descendingIterator() {
 6         return new DescendingIterator();
 7     }
 8
 9     /**
10      * Adapter to provide descending iterators via ListItr.previous
11      */
12 //利用LisItr实现降序迭代
13     private class DescendingIterator implements Iterator<E> {
14         private final ListItr itr = new ListItr(size());
15         public boolean hasNext() {
16             return itr.hasPrevious();    //利用原有方法,改造了一下return
17         }
18         public E next() {
19             return itr.previous();    //利用原有方法,改造了一下return
20         }
21         public void remove() {
22             itr.remove();
23         }
24     }

descendingIterator源码

时间: 2024-08-07 04:31:48

Java LinkedList的ListIterator的相关文章

java LinkedList(链表)

LinkedList也像ArrayList一样实现了基本的List接口,但是它执行某些操作(在List的中间插入和移除)时比ArrayList更高效,但在随机访问方面却要逊色一些 LinkedList还添加了可以使其用作栈,队列或双端队列的方法 这些方法有些彼此之间只是名称有差异,或者只是存在些许差异,以使得这些名字在特定用法的上下文环境中更加适用(特别使在Queun中),例如 getFirst()和element()完全一样,它们都返回列表的头(第一个元素),而不是移除它,如果List为空,则

java 15 -7 ListIterator 的特有方法

列表迭代器:  ListIterator listIterator():List集合特有的迭代器 该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法. 特有功能: A: boolean hasPrevious():判断是否有元素  B:Object previous():获取上一个元素 注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用. 1 import java.util.ArrayList;

基于Java LinkedList,实现Android大数据缓存策略

import java.util.HashMap; import java.util.LinkedList; /* * 基于Java LinkedList,实现Android大数据缓存策略 * 作者:Zhang Phil * 原文出处:http://blog.csdn.net/zhangphil * * 实现原理:原理的模型认为:在LinkedList的头部元素是最旧的缓存数据,在LinkedList的尾部是最新的缓存数据. * 在一个LinkedList(类型C的链表)维护一个存储堆栈,添加元

Java系列: 关于LinkedList的 ListIterator的add和remove

static void testListIteratorAdd(){ LinkedList<String> strList = new LinkedList<String>(); strList.add("1"); strList.add("2"); strList.add("3"); print("init content:"); printCollection(strList); ListItera

java LinkedList的使用方法介绍

LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. LinkedList的构造函数如下 1. public LinkedList():  --生成空的链表 2. public LinkedList(Collection col):  复制构造函数 1.获取链表的第一个和最后一个元素 [java] view plaincopy import java.util.LinkedList; public class LinkedListTest{ public sta

JAVA LinkedList和ArrayList的使用及性能分析

第1部分 List概括List的框架图List 是一个接口,它继承于Collection的接口.它代表着有序的队列.AbstractList 是一个抽象类,它继承于AbstractCollection.AbstractList实现List接口中除size().get(int location)之外的函数.AbstractSequentialList 是一个抽象类,它继承于AbstractList.AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数

Java LinkedList用法

本想找队列Queue,发现那是一个接口,LinkedList实现了Queue接口,可以当作队列来用. 一.概述 Java的LinkedList是一种常用的数据容器,与ArrayList相比,LinkedList的增删操作效率更高,而查改操作效率较低. LinkedList 实现了Queue接口,能当作队列使用. LinkedList 实现了List 接口,能对它进行列表操作. LinkedList 实现了Deque 接口,即能将LinkedList当作双端队列使用. LinkedList 实现了

Java - LinkedList源码分析

java提高篇(二二)---LinkedList 一.概述 LinkedList与ArrayList一样实现List接口,只是ArrayList是List接口的大小可变数组的实现,LinkedList是List接口链表的实现.基于链表实现的方式使得LinkedList在插入和删除时更优于ArrayList,而随机访问则比ArrayList逊色些. LinkedList实现所有可选的列表操作,并允许所有的元素包括null. 除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾

java LinkedList

LinkedLiset的底层是以链表存储 LinkedList部分方法示例: 1 import java.util.LinkedList; 2 3 public class Test { 4 public static void main(String[] args) { 5 LinkedList a1 = new LinkedList(); 6 LinkedList a3 = new LinkedList(); 7 8 a1.add("A");a1.add(1,"B&quo