0

HashMap()次のように定義および割り当てられているとします。

private HashMap<Integer, Integer> rankCombinator=new HashMap<>();

私は常に、アクセスする前にキーと値を使用してHashMapを「構築」しています。たとえば、15個の整数を、必要な対応する値を持つキーとして格納しています。for-eachループを使用してこのマップをトラバースしようとしています。

for(Map.Entry<Integer, Integer> entry : rankCombinator.entrySet())
{
   // More code here.
}

このループは、最初に入力された方法でソートされた値を返さないと思います。私は正しいですか?はいの場合、返される値にパターンはありますか?ドキュメントを調べてみましたが、このパターンが含まれていないようです。

4

4 に答える 4

4

HashMap実装は、アイテムが返される順序について保証しません。順序を保持するを使用することをお勧めしますLinkedHashMap

private Map<Integer, Integer> rankCombinator=new LinkedHashMap<Integer, Integer>();

APIドキュメント

于 2013-01-25T01:44:20.653 に答える
1

短い答え、いいえ。javadocから:「このクラスはマップの順序について保証しません」

ハッシュテーブル内のバケットの数とバケット内の要素の順序に応じて任意です。そのため、再ハッシュが発生すると変化します。

挿入順序に基づいて予測可能な順序が必要な場合は、 LinkedHashMapを使用してください。

于 2013-01-25T01:47:48.723 に答える
1

ハッシュマップは、キーのハッシュコードに基づいてアイテムを「バケット」に格納します。「plain」HashMapは、「ハッシュバケット」でエントリを見つけるとエントリを返します。識別可能なパターンはなく、たとえ見つけたとしても、実装に大きく依存し、信頼性が低くなります。

信頼できる反復順序が必要な場合は、TreeMap(キーでソートされたエントリを取得します)またはLinkedHashMap(挿入順序を取得します)のいずれかを使用します。キーの同等性を判断するメカニズムが異なることに注意してください。そのTreeMapため、キーを比較可能にするか、キーの順序を処理する側にコンパレータを提供します。

于 2013-01-25T01:48:10.100 に答える
0

順序はランダムですが、ハッシュマップ配列ストアのスロットにオブジェクトを割り当てるハッシュ関数によって決定されます。

詳細はこちら:ハッシュテーブルはどのように機能しますか?

于 2013-01-25T01:49:39.097 に答える