仕様から:「マップに以前にキーのマッピングが含まれていた場合、古い値は指定された値に置き換えられます。」value.equals(古い値) が value != 古い値である状況について疑問に思っています。私の仕様の読みは、古い値をまだ置き換える必要があるということです。そうですか?
質問する
25447 次
5 に答える
5
新しいキーが既存のキーと一致する場合、マップされた値はその値に関係なく、たとえばoldValue.equals(newValue)
isであっても置き換えられtrue
ます。
ソースを調べたり、テスト コードに頼ったりする必要はないと思います。これは のドキュメントから明らかですMap.put
。
マップに以前にキーのマッピングが含まれていた場合、古い値は指定された値に置き換えられます。(マップ m は、m.containsKey(k) が true を返す場合にのみ、キー k のマッピングを含むと言われます。)
于 2012-09-25T17:49:18.223 に答える
1
値が等しいかどうかはチェックされず、キーが等しいかどうかのみがチェックされます。指定したキーがマップに既に存在するキーと一致する場合、オブジェクトはその同等のものに置き換えられます。
値が以前にキーに関連付けられている場合、その値はput
メソッドによって返されます。のソースからのスニペットを次に示しますHashMap<K,V>
。
for (Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
于 2012-09-25T17:49:46.303 に答える
1
はい、そうです。簡単なテストでは、次のことがわかります。
Integer a = new Integer(1);
Integer b = new Integer(1);
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("key", a);
map.put("key", b);
System.out.println("Value is b : " + (map.get("key") == b));
于 2012-09-25T17:50:46.443 に答える
0
はい、あなたの理解は正しいです。キーに等しい値が存在する場合map
、新しい値に置き換えられます。
于 2012-09-25T17:48:45.650 に答える
0
私はあなたが正しいと信じています。これは、次のようなコードで確認できます。
Map<String, String> strsMap = new HashMap<String, String>();
String myString1 = new String("mystring");
String myString2 = new String("mystring");
strsMap.put("str", myString1);
System.out.println(myString1 == strsMap.put("str", myString2));
System.out.println(myString2 == strsMap.get("str");
于 2012-09-25T17:51:56.270 に答える