java.util.Map.put(key,value) - 如果value等于现有值,该怎么办?

时间:2012-09-25 17:47:52

标签: java collections map

根据规范:“如果地图以前包含密钥的映射,则旧值将替换为指定的值。”我想知道value.equals(旧值)但值!=旧值的情况。我对规范的解读是旧的价值仍然必须被替换。是吗?

5 个答案:

答案 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");