1

整数キーとオブジェクト値を持つ ConcurrentHashMap が必要です(マップの一部の値は整数で、別の値は文字列です)。これは私のテーブルを初期化して使用する正しい方法ですか?

ConcurrentHashMap table=new ConcurrentHashMap<Integer, Comparable>();
        table.put(new Integer(1), new String("nodata"));
        table.put(new Integer(2), new Integer(23));
4

6 に答える 6

3

初期化ブロック自動ボクシング匿名クラスを使用してうまく行うことができます:

Map table = new ConcurrentHashMap<Integer, Comparable>() {
  {
    this.put(1, "nodata");
    this.put(2, 23);
  }
};
于 2012-09-10T09:54:22.757 に答える
1

はい。ただし、これらすべてのコンストラクターを呼び出さないでください (String#new は本当に良くなく、残りは自動ボックス化できます)。

    ConcurrentHashMap<Integer, Comparable> table=
        new ConcurrentHashMap<Integer, Comparable>();
    table.put(1, "nodata");
    table.put(2, 23);

元の質問に戻ると、tableこれら 3 つのステートメントの後に別のスレッドへの参照を与えると、その最新かつ最高のバージョンが表示されます。2 つのプットを呼び出す前に参照を共有しないでください。

于 2012-09-10T09:52:22.133 に答える
0

ティロの答えに続いて、あなたはさらにこれを行うことができます:

ConcurrentHashMap<Integer, Comparable> table=
        new ConcurrentHashMap<Integer, Comparable>() {{
    put(1, "nodata");
    put(2, 23)
  }}

これは、から派生した匿名クラスを作成HashMapし、静的初期化子から呼び出します。タイピングを削減しますが、匿名クラスの非自明な作成であることに注意してください。これを匿名クラスの悪用と見なす人もいます。上記は、限られたシナリオで使用する必要があります(たとえば、単体テスト用のデータの設定など)。

于 2012-09-10T09:55:27.683 に答える
0

あなたが書いたコードは正しいです。使用する必要があることに注意してください

    table.put(Integer.valueOf(1), "nodata");
    table.put(Integer.valueOf(2), Integer.valueOf(23));

または単に

    table.put(1, "nodata");
    table.put(2, 23);

と の両方がInteger.valueOfと のnew Stringパフォーマンスよりも優れているか、少なくとも同等であるためnew Integerですnew String

于 2012-09-10T09:52:58.203 に答える
0

あなたが行ったことは機能しますが、おそらくこれらすべてのコンストラクターを使用する必要はありません。

table.put(1, "nodata");
table.put(2, 23);

コードをよりコンパクトにする (ただし、少し理解しにくいかもしれません) には、次のようにします。

Map<Integer, Comparable> table=new ConcurrentHashMap<Integer, Comparable>(){{
    put(1, "nodata");
    put(2, 23);
}};

これは、メソッドを呼び出してマップを初期化ConcurrentHashMapする初期化ブロックを使用して、の無名サブクラスを作成します。put

于 2012-09-10T09:53:08.110 に答える