iterator的三种形式

  • Enumeration
    用于遍历vector和hashtable
  • Iterator用于所有collection对象,相比教enumeration,在遍历时可以进行读取和删除操作
    缺点:不能不能新增和替换元素,而且只能单项遍历
    Iterator iterator = collection.iterator(); iterator.hasNext();//boolean iterator.next();//Object iterator.remove()//void
  • listIterator提供双向遍历
    只适用与list集合,不过该接口提供了双向遍历
    ```listIterator.hasPrevious();//boolean
    listIterator.previous();//Object
    listIterator.previousIndex();//int
    listIterator.set();//void replace the last element find by next() or previous()
    listIterator.add()//void add element before the element which will be returned by next()
  • 如果迭代器发现它的集合被另一个迭代器修改了 , 或是被该集合自身的方法修改了 , 就会抛出一个ConcurrentModificationException 异常
  • splitIterator
    Spliterators 和其他的 Iterators一样,都是遍历数据源的手段,包括Collections,IO Channel,Generator function
    他不只支持顺序遍历,而且支持并行
       ORDERED(0x00000010), DISTINCT(0x00000001), SORTED(0x00000004), SIZED(0x00000040), NONNULL(0x00000100), IMMUTABLE(0x00000400), CONCURRENT(0x00001000), SUBSIZED(0x00004000).
    针对不同的特性,characteristic()返回位编码下的的特性值int值,hasChracteritics()检测是否拥有该特性
  • 其中tryAdvance() 方法将next()和hasNext()结合起来,并且可以通过forEachRemaining(Consumer),简单的对Iterator的剩余元素进行遍历
ArrayList<Integer> al = new ArrayList<>(); 

// Add values to the array list. 
al.add(1); 
al.add(2); 
al.add(-3); 
al.add(-3); 
al.add(-4); 
al.add(5); 

Stream<Integer> str1 = al.stream(); 
Spliterator<Integer> splitr1 = str1.spliterator(); 
System.out.println(splitr1.characteristics());
//结合hasNext和next方法
splitr1.tryAdvance((a) -> System.out.println(a+"!"));

// trySplit()  将剩余元素分成两部分,取出第一部分
Spliterator<Integer> splitr2 = splitr1.trySplit(); 
splitr2.forEachRemaining((a) -> System.out.println(a));
splitr1.forEachRemaining((a) -> System.out.println(a));```

除此之外,还可以使用estimateSize和getExactSizeIfKnown来估计遍历对象的大小
任何Iterator的引用在初始化时,下标都会指向首元素之前

作者:gattonero
链接:https://www.jianshu.com/p/25e6174d52fd