Java Hashmap のドキュメントを読んでいますが、この文がわかりません。
HashMap の反復順序は非決定論的であることに注意してください。確定的な反復が必要な場合は、LinkedHashMap を使用します。
決定論的 とはどういう意味ですか?
Java Hashmap のドキュメントを読んでいますが、この文がわかりません。
HashMap の反復順序は非決定論的であることに注意してください。確定的な反復が必要な場合は、LinkedHashMap を使用します。
決定論的 とはどういう意味ですか?
最も簡単な定義:
入力が同じであれば、常に同じ出力が得られます。
上記では、まったく同じ HashMap を反復すると、何も変更していなくても、異なる時点で異なる結果が得られる可能性があると言っています。通常は問題ありませんが、問題がある場合は、LinkedHashMap を使用する必要があります。
あらかじめ「決められた」順序で。
ハッシュの仕組みにより、マップ内の要素は任意の場所に「スクランブル」されます。スクランブリングの位置は、事前に簡単に決定することはできません。決定することはできません。結果の順序はわかりません。
厳密に言えば、HashMap の反復順序はほぼ確実に非決定論的ではありません。大多数の計算プロセスと同様に、まったく同じ方法で実行すると、結果もまったく同じになります。真に非決定論的なシステムには、何らかの外部ランダム要素が組み込まれますが、ここではほとんどそうではありません。少なくともほとんどの場合。
それらが本当に意味することは、マップに特定の要素のセットが含まれているからといって、それらを反復するときに特定の順序で出てくると期待すべきではないということです。これは、反復の順序がランダムであることを意味するのではなく、開発者として、それが何であるかを知ることに頼るべきではないことを意味します。
ほとんどの場合、これの理由は、プラットフォームごとに、および/またはアクセスの順序によって異なる実装の詳細に何らかの依存関係があるためです。そして後者は、本質的に予測不可能なスレッドのスケジューリングとイベントのタイミングによって決定される可能性があります。
ほとんどの場合、任意の個々のプラットフォームで、最も一般的なスレッド モデル (シングル スレッド アプリケーション) を使用して、特定のもののセットを常にシーケンス X で挿入および削除すると、常にシーケンス Y でそれらを取得します。 Y は X とプラットフォームに完全に依存するため、それがどうなるかを考えても意味がありません。
基本的に、ランダムではありませんが、そうである可能性もあります。
簡単に言うと、keys()、values()、または entrySet() を呼び出すと、反復可能なコレクションが返されます。その行は、反復子がオブジェクトを返す順序が特定の順序になるとは期待できないと言っています。特に、キー値による挿入順序と自然順序付けの両方とは異なる場合があります。
イテレータを挿入順に動作させたい場合は、LinkedHashMap を使用します。キー値で繰り返したい場合は、TreeMap を使用します。これらは両方とも、順序を追跡するために余分な作業を行う必要があるため、プレーンな HashMap よりもパフォーマンスがわずかに悪いことに注意してください。
決定論的 : 決定できる非決定論
的 : 決定できない
これは、特定の入力が与えられたときに同じ出力を生成するアルゴリズムです。
私が見つけた良い例:
買い物リスト、つまり購入するアイテムのリストを考えてみましょう。
次の 2 つの方法で解釈できます。
* The instruction to buy all of those items, in any order. This is a nondeterministic algorithm. * The instruction to buy all of those items, in the order given. This is a deterministic algorithm.
非決定論的とは、事前に把握できる単一の結果がないことを意味します。1 +2やlogeのような算術式は、決定論的です。正解は1つだけで、前もって理解することができます。一握りの砂を空中に投げます。各粒子が落ちる場所は、主要な精度については事実上非決定論的です。
基盤となるライブラリとJVM実装のソースコードを見ることができ、結果として生じる順序を決定できる何らかの方法があるため、これはおそらく正確には正しくありません。「特定の順序は保証されていません」などと言った方が正しいかもしれません。
この場合に関連するのは、順序付けに頼ることができないということです。
決定論的とは、結果が予測可能/予測可能であることを意味します。
これは、HashMap が要素を順番に挿入しないため、要素が挿入されたのと同じ順序で反復されない HashMap のプロパティです。したがって、ドキュメントの行
非決定論的とは、明確に定義された動作がないことを意味します。
HashMap の場合、要素を挿入した方法に応じて、反復の順序が異なる場合があります。
HashMap は、追加した順序を維持しません。出力を追加した順序にしたい場合は、LinkedHashMap を使用する必要があります。つまり、追加した順序どおりにdeterministic
出力することを意味します。
以下に例を示します。
HashMap<String, Integer> map = new HashMap<String,Integer>();
map.put("a",5);
map.put("b",16);
map.put("c",46);
System.out.println(map); //ouptput:{a=5, c=46, b=16}
2.決定論的
HashMap<String, Integer> map = new LinkedHashMap<String,Integer>();
map.put("a",5);
map.put("b",16);
map.put("c",46);
System.out.println(map); //output:{a=5, b=16, c=46}