我试图了解Spliterator的功能,并遇到了这两种方法estimatedSize
和getExactSizeIfKnown
,我可以弄清楚什么是estimatedSize
,但不确定是什么{{1} }做。有人可以举例说明两者之间的区别吗?
编辑: 我尝试了下面的示例,其中它们都是相同的。在什么情况下它们会不同?
getExactSizeIfKnown
答案 0 :(得分:5)
estimateSize
方法:
返回对
forEachRemaining(java.util.function.Consumer<? super T>)
遍历将遇到的元素数量的估计,如果无穷大,未知或计算成本太高,则返回Long.MAX_VALUE
。如果此分隔符为
SIZED
且尚未被部分遍历或拆分,或者此分隔符为SUBSIZED
且尚未被部分遍历,则此估计值必须是元素的准确计数被完整遍历遇到。否则,此估算值可能是任意不正确的,但必须按照trySplit()
的调用中指定的那样减小。API注意:
即使不精确的估计值通常也非常有用且计算便宜。例如,近似平衡的二叉树的子拆分器可能返回一个值,该值估计元素的数量为其父代的一半。如果根分割器不能保持准确的计数,则可以估计大小为对应于其最大深度的2的幂。
如果此分隔符为
estimateSize()
,则返回SIZED
的便捷方法,否则返回-1
。实施要求:
如果Spliterator报告特征为
estimateSize()
,则默认实现返回SIZED
的结果,否则返回-1
。
这两个方法均引用SIZED
,即:
特征值,表示遍历或拆分之前从
estimateSize()
返回的值表示一个有限大小,在没有结构源修改的情况下,该大小表示一个元素将遇到的元素数量的精确计数。完全遍历。API注意:
涵盖
Collection
所有元素的大多数集合拆分器均报告了此特征。子分类器(例如HashSet
的子分类器)涵盖元素的子集并近似于其报告的大小。
基于所有这些,只有在Spliterator
没有SIZED
characteristic的情况下,这两种方法才会返回不同的值。
在您的示例中,Spliterator
的来源是ArrayList
。如果我们看一下ArrayList.spliterator()
的文档:
在此列表中的元素上创建late-binding并进行快速故障切换
Spliterator
。
Spliterator
报告Spliterator.SIZED
,Spliterator.SUBSIZED
和Spliterator.ORDERED
。首要的实现应记录其他特征值的报告。
由于具有SUBSIZED
特性,由Spliterator
创建的ArrayList
(包括由trySplit
产生的estimateSize
和{{1 }}返回不同的值。