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
