Splitter中估计尺寸和getExactSizeIfKnown之间的差异

时间:2019-03-30 02:49:44

标签: java java-8 spliterator

我试图了解Spliterator的功能,并遇到了这两种方法estimatedSizegetExactSizeIfKnown,我可以弄清楚什么是estimatedSize,但不确定是什么{{1} }做。有人可以举例说明两者之间的区别吗?

编辑: 我尝试了下面的示例,其中它们都是相同的。在什么情况下它们会不同?

getExactSizeIfKnown

1 个答案:

答案 0 :(得分:5)

estimateSize方法:

  

返回对forEachRemaining(java.util.function.Consumer<? super T>)遍历将遇到的元素数量的估计,如果无穷大,未知或计算成本太高,则返回Long.MAX_VALUE

     

如果此分隔符为SIZED且尚未被部分遍历或拆分,或者此分隔符为SUBSIZED且尚未被部分遍历,则此估计值必须是元素的准确计数被完整遍历遇到。否则,此估算值可能是任意不正确的,但必须按照trySplit()的调用中指定的那样减小。

     

API注意:

     

即使不精确的估计值通常也非常有用且计算便宜。例如,近似平衡的二叉树的子拆分器可能返回一个值,该值估计元素的数量为其父代的一半。如果根分割器不能保持准确的计数,则可以估计大小为对应于其最大深度的2的幂。

getExactSizeIfKnown方法是:

  

如果此分隔符为estimateSize(),则返回SIZED的便捷方法,否则返回-1

     

实施要求:

     

如果Spliterator报告特征为estimateSize(),则默认实现返回SIZED的结果,否则返回-1

这两个方法均引用SIZED,即:

  

特征值,表示遍历或拆分之前从estimateSize()返回的值表示一个有限大小,在没有结构源修改的情况下,该大小表示一个元素将遇到的元素数量的精确计数。完全遍历。

     

API注意:

     

涵盖Collection所有元素的大多数集合拆分器均报告了此特征。子分类器(例如HashSet的子分类器)涵盖元素的子集并近似于其报告的大小。

基于所有这些,只有在Spliterator没有SIZED characteristic的情况下,这两种方法才会返回不同的值。


在您的示例中,Spliterator的来源是ArrayList。如果我们看一下ArrayList.spliterator()的文档:

  

在此列表中的元素上创建late-binding并进行快速故障切换Spliterator

     

Spliterator报告Spliterator.SIZEDSpliterator.SUBSIZEDSpliterator.ORDERED。首要的实现应记录其他特征值的报告。

由于具有SUBSIZED特性,由Spliterator创建的ArrayList(包括由trySplit产生的estimateSize和{{1 }}返回不同的值。