0

でテストしましたjava.util.IdentityHashMap、参照

public class IdentityHashMapTest{
    public static void main(String args[]) {
        Map<String, String> m = new IdentityHashMap<String, String>();
        m.put("John", "Doe");
        m.put("John", "Paul");
        System.out.println(m.size());
    }
}

Java APIによると、

このクラスは、キー (および値) を比較するときに、オブジェクトの等価性の代わりに参照の等価性を使用して、ハッシュ テーブルを使用して Map インターフェイスを実装します。

結果は2. でも実際は1。IdentityHashMap クラスは間違っていますか?

4

3 に答える 3

5

に変更します

       m.put("John", "Doe");
       m.put(new String("John"), "Paul");

2 つのエントリがあります。文字列リテラルはプールされるため、"John" == "John".

于 2012-08-31T10:54:35.127 に答える
1

IdentityHashMapMap 契約に違反し、equalsメソッドの代わりにオブジェクト ID を使用してキーの等価性をチェックします。文字列は実際には 1 つのオブジェクトとしてプールnew String("John")されるため、Map に新しいエントリを作成するために使用する必要があります。

于 2012-08-31T10:54:48.800 に答える
1

これは、文字列リテラルがプールされているためです。

"John" == "John"それが本当かどうかをテストできます。

したがって、使用する 2 つのキーは等しいだけでなく、同一です。

JLS #3.10.5からの抜粋:

さらに、文字列リテラルは常に String クラスの同じインスタンスを参照します。これは、一意のインスタンスを共有するために、文字列リテラルが「インターン」されているためです。

于 2012-08-31T10:54:55.300 に答える