Iterator 和 Spliterator 的区别
Iterator | Spliterator |
---|---|
从 Java 1.2 开始。 | 从 Java 8 开始。 |
可用于迭代所有集合类。 | 可用于迭代数组、流、列表和集合。不可以用于MAP。 |
不支持并行处理。 | 支持并行处理。 |
ArrayList spliterator() 方法返回最后绑定且快速失败的 Spliterator 实例。
Java Spliterator 用于遍历和分区源的元素,例如 array
、Set
、List
或者 IO 通道。
on
it
road
.com
ArrayList spliterator()方法 示例
Spliterator
可用于许多用例。
在下面给出的示例中讨论的用例很少。
tryAdvance() - 一次迭代一个元素
Java 程序使用拆分器一次迭代一个元素。
它等价于 Iterator
接口中的 iterator.next() 方法。
import java.util.ArrayList; import java.util.Arrays; import java.util.Spliterator; public class ArrayListExample { public static void main(String[] args) { ArrayList<Integer> doirts = new ArrayList<>(Arrays.asList(1,2,3,4,5,6)); Spliterator<Integer> sItr = doirts.spliterator(); sItr.tryAdvance( d -> System.out.println( d ) ); sItr.tryAdvance( d -> System.out.println( d ) ); sItr.tryAdvance( d -> System.out.println( d ) ); } }
程序输出。
1 2 3
forEachRemaining() - 迭代所有元素
Java 程序来迭代所有元素并对它们执行操作。
它等效于循环中的 iterator.hasNext()
方法和 iterator.next()
。
import java.util.ArrayList; import java.util.Arrays; import java.util.Spliterator; public class ArrayListExample { public static void main(String[] args) { ArrayList<Integer> doirts = new ArrayList<>(Arrays.asList(1,2,3,4,5,6)); Spliterator<Integer> sItr = doirts.spliterator(); sItr.tryAdvance( d -> System.out.println( d ) ); //1 sItr.tryAdvance( d -> System.out.println( d ) ); //2 sItr.forEachRemaining( d -> System.out.println( d ) ); //3,4,5,6 } }
程序输出。
1 2 3 4 5 6
trySplit() - 并行处理
如果我们正在处理并发应用程序并且列表具有大量元素,那么最好将列表分成两部分并并行处理。
trySplit()
方法将当前拆分器拆分为两个并返回新的拆分器。
它指向的元素被分成两个相等的列表。
请记住,默认情况下,单个Spliterator
不是线程安全的。
应用程序代码负责创建不同的线程并移交 Spliterator
实例。
import java.util.ArrayList; import java.util.Arrays; import java.util.Spliterator; public class ArrayListExample { public static void main(String[] args) { ArrayList<Integer> doirts = new ArrayList<>(Arrays.asList(1,2,3,4,5,6)); Spliterator<Integer> sItr1 = doirts.spliterator(); Spliterator<Integer> sItr2 = sItr1.trySplit(); System.out.println(sItr1.getExactSizeIfKnown()); //3 sItr1.forEachRemaining( d -> System.out.println( d ) ); //4,5,6 System.out.println("==========="); System.out.println(sItr2.getExactSizeIfKnown()); //3 sItr2.forEachRemaining( d -> System.out.println( d ) ); //1,2,3 } }
程序输出。
3 4 5 6 =========== 3 1 2 3
ArrayList spliterator() 方法
方法定义
在arraylist的情况下,spliterator()
方法返回ArrayListSpliterator
类的实例,该类在ArrayList
的内部类中并实现Spliterator
接口。
public Spliterator<E> spliterator() { return new ArrayListSpliterator<>(this, 0, -1, 0); } static final class ArrayListSpliterator<E> implements Spliterator<E> { //implementation }
Spliterator 是快速失败的,这意味着在绑定发生后,会检测到对元素的任何干扰,并抛出一个 ConcurrentModificationException
。
特征
ArrayList
返回的拆分器是:
- ORDERED - 表示元素在遍历和分区时具有定义的顺序。
- SORTED - 表示元素遵循预定义的排序顺序。
- SUBSIZED - 表示这个和任何进一步产生的 Spliterator 都是 SIZED 。这里 SIZED 表示 Spliterator 是从一个已知大小的来源创建的。
日期:2020-09-17 00:09:57 来源:oir作者:oir