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