2016-08-03 6 views
2

質問があります。これは、JavaでのHashSetの順序をmantainが、私のプログラムJavaハッシュセットとツリーセット

public static void main(String[] args) { 
    HashSet<Integer> io=new HashSet<Integer>(); 

    Integer io1=new Integer(4); 
    Integer io2=new Integer(5); 
    Integer io3=new Integer(6); 

    io.add(io2); 
    io.add(io3); 
    io.add(io1); 

    System.out.println(io); 
} 

を見て、それが私に与えてそれを実行しないことを言って毎回私はそれを実行に設定命じました。なぜこれが起こっているのですか?

もう一つの問題は、次のとおりです。(私は私のクラスを使用して整数のTreeSetのとinteadを使用して、以前のプログラムではなく、代わりにHashSetので行ったように)私はTreeSetのを実装する場合、私は、のcompareToを実装する必要がありますか? oracle docs 1として

+0

ちょうど偶然... – user1121883

答えて

3

HashSetは秩序を維持しませんが、それはあなたがそれらを印刷、いくつかのために、要素を反復しなければなりません。 HashSetは、HashMapによってサポートされています。これは、要素が格納されているビンの順序で要素を反復処理します。単純な例では、4,5,6はビン4,5,6にマッピングされます(整数のhashCodeは整数の値なので)。したがって、昇順に出力されます。

デフォルトの最初のビン数が16であるため、40,50,60を追加しようとすると、別の注文([50, 40, 60])が表示されるため、ハッシュコード40,50,60はビン40%そう50が最初の要素はTreeSet<SomeCostumClass>として50と60

続いて、反復される16(8)、50%が16(2)、60%16(12)、あなたは、SomeCostumClassComparable<SomeCostumClass>を実装するか、またはComparator<SomeCostumClass>をコンストラクタに渡します。

+0

これらのどちらかを実装する必要がありますか? – User124235

+0

@ user124235はい – Eran

+0

お返事ありがとうございます – User124235

3

、あなたが同じ順番にすべての時間を得るという保証はありません。

このクラスは、ハッシュテーブル (実際にはHashMapインスタンス)を基にしたSetインターフェイスを実装しています。これは、セットの反復順序の については保証しません。特に、 が時間の経過とともに一定のままであることを保証するものではありません。

+0

私はこれが質問に答えるとは思わない。問題は、プログラムを実行するたびに同じ注文を出すのはなぜですか? 'HashSet'のドキュメンテーションが私たちがそうすることを保証しているかどうかではありません。 –

1

HashSetは、それぞれのオブジェクトhashCode()の結果によって駆動される内部ハッシュテーブル(https://en.wikipedia.org/wiki/Hash_table)を保持します。ほとんどのオブジェクトでは、hashCode()関数が決定的であるので、同じ要素のHashSetを反復した結果は、おそらく同じになります。それは注文されることを意味しません。しかし、具体的にはIntegerの場合、関数のhashCode()は整数そのものを返します。したがって、単一レベルのハッシュテーブルに対しては順序付けられます。

関連する問題