1

私たちは皆、反復順序の設定(そのような実装を除く)doesn't guaranteeを知っています。そのため、以下のサンプル コードでこれを確認しようとしました。

public static void main(String[] args) throws InterruptedException {
    Map<String,String> lMap=new HashMap<String, String>();
    lMap.put("A", "A");
    lMap.put("B", "B");
    lMap.put("C", "C");
    lMap.put("D", "D");
    lMap.put("E", "E");
    lMap.put("F", "F");
    lMap.put("G", "G");
    lMap.put("H", "H");
    lMap.put("I", "I");
    lMap.put("J", "J");
    lMap.put("K", "K");
    lMap.put("L", "L");
    for(int i=0;i<10000;i++){

        Thread.sleep(100);
        Set<Entry<String, String>> entrYset=lMap.entrySet();
        for(Map.Entry<String, String> e:entrYset){
            System.out.println(e.getKey()+" , "+e.getValue());
        }
                  System.out.println("******************************************************");
    }
}

上記のコードを何度も実行したところ、レコードが順番に印刷されていることがわかりました。

私の質問は、Java がHashMapが順序付けられていないと主張する場合、なぜこのレコードが順番に印刷されるのかということです。誰かが例を挙げて理由を教えてくれれば、それは素晴らしいことです。

4

6 に答える 6

5

文字列のハッシュコードは変わらず、同じ順序で挿入しているため、順序は毎回同じです。ハッシュマップは決定論的であるため、同じハッシュマップを作成して同じ順序で挿入すると、常に一貫した順序が得られます。

Hashmap は、この順序が一貫していることを保証しません。さらに項目を挿入すると、ハッシュ テーブルが再構築されるため、順序が完全に変わる可能性があります。

于 2012-09-13T07:40:09.157 に答える
2

新しい要素をマップに追加すると、通常、並べ替えが発生します。マップのサイズが変更されると、順序が変わる場合があります。

于 2012-09-13T07:38:57.513 に答える
1

その理由は文字列ハッシュコード

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}

文字列が 1 つの場合、h = 31*0+文字の数値となるため、すべてのハッシュ コードは 1) 低 2) 文字と同じ順序になります。したがって、この順序で返される可能性があります。

于 2012-09-13T07:41:04.783 に答える
0

あなたは「保証されていない」と「そうでないことが保証されている」を混同しています。

もちろん、HashMapにはいくつかの内部順序を設定できます。

ドキュメントが主張している唯一のことは、HashMap内のアイテムの順序に依存してはならないということです。そうすると、(同様の実験結果に基づいて)警告されます。

于 2012-09-13T07:50:47.370 に答える
0

ハッシュ テーブルは、ハッシュ関数を使用して値をセットに入れます。そのため、ハッシュ値によって順序が変わる場合があります。したがって、同じハッシュ関数を持つハッシュ テーブルに同じ値を追加します。そのため、セットに注文が表示されます。値または値の挿入順序を変更してみてください。結果の順序が変わる場合があります。

于 2012-09-13T07:42:50.810 に答える
0

あなたは間違っています。Javadocを見ると、それは言う

This class makes no guarantees as to the order of the map; 
In particular, it does not guarantee that the order will remain constant over time

ドキュメントには、挿入順序の維持に関する特定の保証はHashMapで保証できないと記載されていることに注意してください。これはほとんどの場合、HashMap が内部的にサイズ変更された場合に関係しています。

HashMap(int initialCapacity, float loadFactor)のこのコンストラクターを使用して、内部のサイズ変更を複製することにより、 initialCapacityloadFactorを試してみてください。違いがわかると思います。ああ、私があなたのコードを実行したとき、私の注文はあなたが質問の一部として投稿したものとはまったく異なっていました.

于 2012-09-13T07:40:34.363 に答える