• Java 集合 LinkedList的ListIterator


    Java 集合 LinkedList的ListIterator

    @author ixenos

    摘要:ListIterator<E>是继承自Iterator<E>的接口、listIterator(int index)源码分析、利用ListItr实现的降序迭代

    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源码
  • 相关阅读:
    Nginx禁止IP,只允许指定域名访问
    预防vsphere勒索病毒,适用于 ESXi 6.x 中的 OpenSLP 安全漏洞 (CVE-2019-5544) 的权宜措施 (76372)
    解决 vCenter root 密码过期无法登陆 User password expired
    停用Veritas Smart Meter-概念与操作
    centos7.0 没有netstat 和 ifconfig命令问题
    MAVEN剪除传递依赖
    Spring+SpringMVC+MyBatis+Maven框架整合
    CentOS7配置MongoDB
    利用mybatis-generator自动生成代码
    idea提交本地项目到git
  • 原文地址:https://www.cnblogs.com/ixenos/p/5668797.html
Copyright © 2020-2023  润新知