4

次のコードを参照してください。

public static void main (String[] args) {
    Map<Number, String> map = new HashMap<Number, String>();
    map.put(1L, "test");
    System.out.println(map.get(1));
}

HashMap.get が null を返すのはなぜですか? O_o hashCode 関数が 1 を返すオブジェクトは必ず値を返さなければなりませんね。

更新しました

問題は、Map インターフェイスがパラメーター化された型ではなくオブジェクトを受け取ることです。なので、どんなオブジェクトでもキーにできると思っていたのですが、 HashMap 実装のチェック型が equals だったのは意外でした。

また、オートボクシングは問題ではありません。1 は Integer になり、1L は Long になりました。しかし、それらは同じハッシュコードを持っています。したがって、実装 Map#get は、同じハッシュコードを持つオブジェクトの値を返す必要があると考えていました。

4

5 に答える 5

6

1L ( Long) のキーを置き、1 ( ) のキーを取得していますInteger

それらは同じものではないので、注意してください。

put から L を削除するか、get に L を追加します。または、さらに良いことに、それらをプリミティブとして書き出さず、オートボクシングに依存してください。

于 2013-10-22T07:56:34.063 に答える
1

put と get の間に型の不一致があります。

ここで何が起こるかというと、AutoBoxing です。Java は、プリミティブから同等のものへの変換、およびその逆の変換を、 を介してでObjectはなく自動的に実行します。new()IntegerLong

以下の方法を試してください。

public static void main (String[] args) {
        Map<Number, String> map = new HashMap<Number, String>();
        map.put(1L, "test");
        System.out.println(map.get(1L));
    }

または

public static void main (String[] args) {
        Map<Number, String> map = new HashMap<Number, String>();
        map.put(1, "test");
        System.out.println(map.get(1));
    }

どちらもvalue(1) は同じですが、オブジェクトは異なりますが、そうequalではありません。

i.e. Integer(1) != Long(1).

それがここでの問題であり、Auto-boxing を使用することによって発生しています。

簡単な例

        Long l = new Long(1);
        Integer i = new Integer(1);
        System.out.println(i.equals(l)); //false -->Hashmap get() failed here
        System.out.println(i.intValue() ==l.intValue());//true
于 2013-10-22T07:56:33.067 に答える