2016-04-12 7 views
1

LinkedHashMap<Long, String> myHashMap = new LinkedHashMap<>(); 
myHashMap.put(new Long(1), "A Value"); 

質問

  1. 参照またはコピーキーですか?
  2. String aValue = myHashMap.get(new Long(1));と書くと、"A Value"が返ってきますか?または、私はちょうど別のオブジェクト(参照)を照会したので、エラーが表示されますか?
+1

試したときどうしましたか? 'HashMap'のjavadocは何を表していますか? – Savior

+0

[javadoc](https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html)の5番目の段落(「多くのマッピングがある場合は...」)では、 hashCode() '、しかし私は必要な答えを得ることができません。私は読んで/フォーカスする必要がある部分を指摘できましたか? – sargas

+0

@sargasあなたの質問には 'hashCode'は言及されていません。 'hashCode'は、エントリが格納されている配列のインデックスを決定するために使用されます。同じ' hashCode'を持つエントリが多すぎると、パフォーマンスが低下します。 –

答えて

3
  1. このキーは、同じインスタンスへの参照です。
  2. Long

    • equals()return value == obj.longValue())、
    • hashCode()return Long.hashCode(value))をオーバーライドしているので、あなたは、バック"A Value"を取得します。
+1

あなたの答えは私にとって非常に洞察力があります。この情報を見つけるために、[Map Interfaceのドキュメント](https://docs.oracle.com/javase/8/docs/api/java/util/Map.html)を読む必要がありました(HashMapまたはLinkedHashMapではなく)もの)。 – sargas

5
  1. マップには、引数として渡されたオブジェクトへの参照のコピーが格納されます。オブジェクトのコピーは作成されません。
  2. はい、「値」が返ってきます。マップは、==ではなく、equals()でキーを比較します(IdentityHashMapを除く)。あなたはそれをかなり簡単にテストすることができました。
+0

マップにオブジェクトの「hashCode()」が格納されていませんか?そして、==でハッシュを比較しますか? equals()を実装すると、この特定の理由で常にhashCodeを実装することになっています – Alex

+0

はい、そうです。しかし、等しいhashCodesは、オブジェクトが等しいことを意味しません。最後に、キーはequals()と比較されます。私の指摘は、キーが '=='かどうかをテストするのではなく、キーが等しいかどうかをテストすることです。 –

関連する問題