私はSpliteratorの機能を理解しようとすると、これらの2つの方法に出くわしていますestimatedSize
し、getExactSizeIfKnown
私は何であるかを見つけ出すことができ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
方法:
戻り値で遭遇するであろう要素の数の推定値
forEachRemaining(java.util.function.Consumer<? super T>)
トラバーサル、または戻りLong.MAX_VALUE
無限、不明、またはあまりにも高価で計算する場合。このSpliteratorがある場合は
SIZED
、まだ部分的に横断または分割されていない、またはこのSpliteratorがありSUBSIZED
、まだ部分的に横断されていない、この推定値は、完全なトラバーサルで遭遇するであろう要素の正確なカウントでなければなりません。それ以外の場合、この推定値は任意に不正確かもしれないが、全体の指定された呼び出しとして減少しなければなりませんtrySplit()
。API注:
でも、不正確な推定値は、多くの場合、計算に便利で安価です。例えば、約バランスバイナリツリーのサブspliterator要素の数は、その親の半分であることが推定値を返すことができます。ルートSpliteratorは、正確なカウントを維持しない場合、それはその最大の深さに対応する2の累乗であることをサイズを見積もることができます。
そして、getExactSizeIfKnown
この方法は以下のとおりです。
リターンという簡易メソッド
estimateSize()
このSpliteratorであればSIZED
、そうでありません-1
。実装要件:
デフォルトの実装では、結果を返す
estimateSize()
Spliteratorはの特性を報告した場合SIZED
、および-1
それ以外を。
これらの方法の参照の両方SIZED
です。
返された値という特性値を意味
estimateSize()
トラバーサルまたは分割前は、構造ソース修飾の非存在下で、完全なトラバーサルが遭遇される要素の数の正確なカウントを表し、有限の大きさを表します。API注:
コレクションのための最もSpliterators、そのカバーのすべての要素
Collection
のレポートこの特徴。例えばためのもののようなサブspliterators、HashSet
要素の部分集合をカバーし、その報告されたサイズに近似し、ありません。
場合は、このすべてに基づいて、二つの方法は今まで、異なる値を返しますSpliterator
がありませんSIZED
特性を。
あなたの例では、のソースがSpliterator
ありますArrayList
。我々は、のドキュメントを見ている場合ArrayList.spliterator()
:
作成遅延バインディングとフェイルファスト
Spliterator
このリスト内の要素の上に。
Spliterator
レポートSpliterator.SIZED
、Spliterator.SUBSIZED
とSpliterator.ORDERED
。オーバーライド実装では、追加の特性値の報告を文書化する必要があります。
ためにSUBSIZED
特徴的な、Spliterator
から作成さArrayList
から生じるもの-including trySplit
-will決して持ちestimateSize
とgetExactSizeIfKnown
異なる値を返します。