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

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

public static void main(String[] args) {
        List<Integer> l = new ArrayList<>();
        l.add(1);
        l.add(2);
        l.add(3);
        Spliterator<Integer> s= (Spliterator<Integer>) l.spliterator();
    Spliterator<Integer> s1=s.trySplit();
    while(s.tryAdvance(n -> {System.out.print(n+" ");System.out.println("estimateSize "+s.estimateSize()+" getexactsizeifknown "+s.getExactSizeIfKnown());}));

最佳答案

estimateSize 方法:



getExactSizeIfKnown 方法是:



这两个方法都引用了 SIZED ,它是一个:



基于所有这些,如果Spliterator不具有SIZED characteristic,则这两种方法将仅返回不同的值。

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



由于 SUBSIZED 特性,从Spliterator创建的ArrayList(包括由trySplit生成的estimateSize)将永远不会让getExactSizeIfKnown和ojit_code返回不同​​的值。

09-13 00:29