根据规范:“如果地图以前包含密钥的映射,则旧值将替换为指定的值。”我想知道value.equals(旧值)但值!=旧值的情况。我对规范的解读是旧的价值仍然必须被替换。是吗?
答案 0 :(得分:5)
如果新密钥与现有密钥匹配,则无论其值如何,映射值都将被替换,例如,即使oldValue.equals(newValue)
是true
。
我认为我们不需要查看来源或依赖测试代码:我们在Map.put
的文档中明确指出:
如果地图以前包含该键的映射,则旧值将替换为指定的值。 (当且仅当m.containsKey(k)返回true时,地图m才包含密钥k的映射。)
答案 1 :(得分: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;
}
}
答案 2 :(得分: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));
答案 3 :(得分:0)
是的,您的理解是正确的,如果map
中键存在相同的值,则会将其替换为新值。
答案 4 :(得分: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");