2013-09-06 1 views

答えて

8

この動作は、いくつかの別の理由によって発生します

  • 整数ハッシュ自らJavaで
  • 、配列によってバックアップされHashMap sおよびHashSet sまで
  • 彼らはまた、より高い使用してハッシュを変更します下位ビットを変更するためのビット;ハッシュが範囲0にある場合。15は、それゆえ、オブジェクトが何が起こっバケット
  • を変更していないマップまたはセットの繰り返し処理を行う場合、あなたならば、内部表がそう順次

をスキャンする修正ハッシュ

  • の下位ビットに依存これは何が起こるかである、ハッシュマップ/ HashSetのにいくつかの小さな(< 16)の整数を追加します。

    • それはあまりトンだから整数iはハッシュコードi
    • を持っていますhan 16、修正されたハッシュも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

  • 1

    HashSetは順序付けられていないコレクションです。それには保証はなく、「発注」の概念もありません。 What is the difference between Set and List?

    ご注文、ソートセットが必要な場合は、TreeSetをご検討ください。

    ソートされていない順序付きセットの場合は、LinkedHashSetもあります。

    +0

    @superEb私は実際に私の応答にその宣伝を追加しました。私たちは同時にそれを実現したように見えます! – Kon

    0

    set(java)は、順序付きリストではありません。代わりにArrayListを使用してください。 Java Collection APIも参照してください。

    +0

    要素が一意でなければならない場合は 'List'を使用しないでください。 – superEb

    +0

    速い(一定時間)ルックアップを望むが予測可能な反復順序が必要な場合は、通常は 'LinkedHashSet'が良い選択です。スペースを節約しようとしている場合にのみ 'ArrayList'を使い、遅い(線形時間)ルックアップを許容することができます。 –

    +0

    @Ashwin 'Collections.binarySearch()'メソッドを使って、ソートされたリストの対数時間O(log n)ルックアップ時間を得ることができることに注意してください。 – Kon

    5

    HashSetは、ドキュメントごとに注文の概念を保証するものではありません。今後のJavaのアップデートでは、あなたの見ているものが大きく変わる可能性があります。あなたは、なぜJavaの(今のところ)を迷っている場合は、HashSetの具体的な実装では、あなたが見ている結果を生成

    :それはそのHashMapの内部エントリテーブル内の場所に価値のInteger1ハッシュためです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は、内部エントリテーブルを反復することによって行われます。これは、テーブルの前の項目が最初に来ることを意味します。

    関連する問題