ハッシュセットがソートされていない場合でも、次のコードでは出力が[1,2]
になります。このHashSetはどのようにソートされた出力を生成していますか?
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
なぜですか?
ハッシュセットがソートされていない場合でも、次のコードでは出力が[1,2]
になります。このHashSetはどのようにソートされた出力を生成していますか?
Set set = new HashSet();
set.add(new Integer(2));
set.add(new Integer(1));
System.out.println(set);
なぜですか?
この動作は、いくつかの別の理由によって発生します
HashMap
sおよびHashSet
sまでをスキャンする修正ハッシュ
i
はハッシュコードi
i
i
注意される小さな整数があり、そのバケットの初期数が小さすぎる場合には、整数後に番号が付けられていないバケットに着地することがあります。
HashSet<Integer> set = new HashSet<>(4);
set.add(5); set.add(3); set.add(1);
for(int i : set) {
System.out.print(i);
}
プリント153
HashSetは順序付けられていないコレクションです。それには保証はなく、「発注」の概念もありません。 What is the difference between Set and List?
ご注文、ソートセットが必要な場合は、TreeSetをご検討ください。
ソートされていない順序付きセットの場合は、LinkedHashSetもあります。
@superEb私は実際に私の応答にその宣伝を追加しました。私たちは同時にそれを実現したように見えます! – Kon
set
(java)は、順序付きリストではありません。代わりにArrayList
を使用してください。 Java Collection APIも参照してください。
HashSet
は、ドキュメントごとに注文の概念を保証するものではありません。今後のJavaのアップデートでは、あなたの見ているものが大きく変わる可能性があります。あなたは、なぜJavaの(今のところ)を迷っている場合は、HashSet
の具体的な実装では、あなたが見ている結果を生成
:それはそのHashMap
の内部エントリテーブル内の場所に価値のInteger
1
ハッシュためです2
ハッシュがある場所(HashSet
には実際には任意の値のHashMap
が付いています)の前にがあります。 Integer
オブジェクトのハッシュコードは単なる値なので、これは意味があります。あなたも、より多くの数字を追加した場合でも
実際には、あなたはこれを見ることができます(特定の範囲内:デフォルトでは16であるエントリテーブルのサイズ):
Set<Integer> set = new HashSet<>();
set.add(2);
set.add(1);
set.add(4);
set.add(3);
set.add(0);
System.out.println(set);
[0, 1, 2, 3, 4]
反復オーバーHashSet
は、内部エントリテーブルを反復することによって行われます。これは、テーブルの前の項目が最初に来ることを意味します。
複数のテストケースを使用します。 20の数字を含めて、結果が同じかどうかを確認してください。 – JNL