2016-07-26 17 views
1
public class TestClass {  

    public static void main(String[] args) 
    { 
     HashMap<String,Integer> testMap = new HashMap<String,Integer>(); 
     testMap.put("Key1", 1); 
     testMap.put("Key2", 2); 
     testMap.put("Key3", 3); 
     testMap.put("Key4", 4); 
     testMap.put("Key5", 5); 
     //[Key2, Key1, Key4, Key3, Key5] //java7 
     //[Key2, Key1, Key5, Key4, Key3] //java8 
     System.out.println(testMap.keySet().toString()); 
    } 

} 

なぜキーの順序に違いがありますか?Java 7では、HashMap.KeySet()が異なる順序でキーを返します。Java 8

+9

実際には、セット内の要素の順序(keySetなど)は定義されておらず、何でもかまいません。特定の注文が必要な場合は、SortedMapを使用するか、キーを使用する前にソートしてください。 Javaのバージョンの変更は、HashMap内の値を保持するために異なるサイズの配列を使用することにつながります(ちょっと推測すると)。 –

+1

セットの順序はありません – Dariusz

+0

プログラムを実行してキーセットを取得した回数で、ほとんどの場合、違いが見つかります。したがって、Java 7またはJava 8のキーセットコードには違いはありません。 – Imran

答えて

3

を使用することができ、順序を維持しない理由があり、キーの順序の違い? Javaの間のHashMapの実装に大きな変更があった

    1. のJava仕様(すなわちのjavadocが)のHashMapのキーセットの順序を指定していない、と

  • ので7およびJava 8に準拠しています。

    これらの実装の変更点(パフォーマンスの大幅な向上)は、キーセットの変更の順​​序をもたらしました。

    しかし、これはキーセットの順序が常にと明記されていないため、「破損」とはみなされません。 ....これに頼るべきではないという意味です。

    +0

    大きな変更は...に関連していますか? –

    +0

    @AndrewsBAnthonyデータは別々に格納され、したがって異なる方法で反復されます。注文に影響を与える可能性のあるすべての変更を見つけるために、ソースを読んで比較する必要があります。 –

    +0

    パフォーマンスに関連して....私は言ったように。実際には、ある長さを超えるハッシュチェーンがバイナリツリーに変換される可能性があります。詳細は、Java 8のソースコードを参照してください。 –

    2

    発注は仕様に従って保証されません。個々のVMは自由に実装できます。

    +2

    @JFMeier貴重なものなら、それを答えに変えてください。 –

    +0

    実際にコレクションはJavaで書かれているので、VMはコレクション要素の順序とは関係ありません。 – ekaerovets

    1

    ハッシュマップは、あなたが挿入を注文したい場合は、のLinkedHashMap :)

    0

    Mapインターフェイスのハッシュテーブルベースの実装。この実装は、すべてのオプションのマップ操作を提供し、ヌル値とヌルキーを許可します。 (HashMapクラスは、非同期であり、nullを許可する点を除いて、Hashtableにほぼ相当します)。このクラスは、マップの順序に関しては保証しません。特に、注文が時間の経過とともに一定であることを保証するものではありません。

    関連する問題