来自规范:“如果映射先前包含键的映射,则旧值将替换为指定值。” 我想知道 value.equals(the old value) 但 value != old value 的情况。我对规范的解读是,旧值仍然必须被替换。是对的吗?
问问题
25447 次
5 回答
5
如果新键与现有键匹配,则无论其值如何,映射的值都将被替换,例如即使oldValue.equals(newValue)
is true
。
我认为我们不需要查看源代码或依赖测试代码:这在文档中是明确的Map.put
,我们在其中找到:
如果映射先前包含键的映射,则旧值将替换为指定值。(当且仅当 m.containsKey(k) 返回 true 时,映射 m 被称为包含键 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
是的,您的理解是正确的,如果keymap
存在相等的值,它将被新值替换。
于 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 回答