0
public static void main(String args[]) throws Exception {
    ConcurrentHashMap<byte[], Integer> dps =
         new ConcurrentHashMap<byte[], Integer>();

    System.out.println(dps.putIfAbsent("hi".getBytes(), 1));
    System.out.println(dps.putIfAbsent("hi".getBytes(), 1));
}

版画

null
null

12 行目にa が出力されないのはなぜですか? のセマンティクスを読みましたが、putIfAbsent動作することが保証されているはずです。(注: これは大規模な並行プログラムから抽出されたものです...ご覧のとおり、現在はシングルスレッドです。)

4

1 に答える 1

5

putIfAbsent() が ConcurrentHashMap で機能しない

"hi".getBytes()は定数配列ではないため、そこに 2 つの異なるオブジェクトを生成しています。次のようなことをすると、1.

byte[] bytes = "hi".getBytes();
System.out.println(dps.putIfAbsent(bytes, 1));
System.out.println(dps.putIfAbsent(bytes, 1));

配列のhashCode()andequals(...)メソッドは、オブジェクトの内容ではなく、参照のみを参照します。byte[]Object

何かを a に保存するときはいつでも、参照を比較したいだけでない限り、オーバーライドとメソッドMapを確実にする必要があります。これは Java FAQ です。次のドキュメントを参照してください: Java の理論と実践: ハッシュ化hashCode()equals(...)

@Mauren がコメントで言及しているように、コンテンツを使用するには、適切なメソッドとメソッドbyte[]をラップして提供する小さなクラスを作成する必要があります。または @CostiCiudatu が言及しているように、 aを使用して、配列の内容を調べるaを使用できます。byte[]hashCode()equals(...)SortedMapComparatorbyte[]

余談ですが、文字セットなどに基づいたクラスでエンコードされた をString.getBytes()返す場合..new byte[]StringCoding.StringEncoder

于 2013-10-01T19:57:39.410 に答える