Iterator 和 Spliterator 的区别

IteratorSpliterator
从 Java 1.2 开始。从 Java 8 开始。
可用于迭代所有集合类。可用于迭代数组、流、列表和集合。不可以用于MAP。
不支持并行处理。支持并行处理。
Java ArrayList spliterator()

ArrayList spliterator() 方法返回最后绑定且快速失败的 Spliterator 实例。
Java Spliterator 用于遍历和分区源的元素,例如 arraySetList或者 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