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

java.util.Map.put(键,值)-如果值等于现有值怎么办?,java,collections,map,Java,Collections,Map,根据规范:“如果映射之前包含键的映射,那么旧值将被指定的值替换。”我想知道value.equals(旧值)但是value!=旧价值观。我对规范的理解是,旧值仍然必须被替换。是吗?是的,您的理解是正确的,如果map中对于键存在相等的值,它将被替换为新值。如果新键与现有键匹配,则映射的值将被替换,而不管它的值是什么,例如,即使oldValue.equals(newValue)为true 我认为我们不需要查看源代码,也不需要依赖测试代码:这在的文档中是明确的,我们发现: 如果映射以前包含键的映射,则旧

根据规范:“如果映射之前包含键的映射,那么旧值将被指定的值替换。”我想知道value.equals(旧值)但是value!=旧价值观。我对规范的理解是,旧值仍然必须被替换。是吗?

是的,您的理解是正确的,如果
map
中对于键存在相等的值,它将被替换为新值。

如果新键与现有键匹配,则映射的值将被替换,而不管它的值是什么,例如,即使
oldValue.equals(newValue)
true

我认为我们不需要查看源代码,也不需要依赖测试代码:这在的文档中是明确的,我们发现:

如果映射以前包含键的映射,则旧值将替换为指定值。(称映射m包含密钥k的映射,当且仅当m.containsKey(k)返回true。)


不检查值相等,只检查键相等。如果指定的键与映射中已存在的键匹配,则对象将替换为其相等项

如果以前有一个值与该键关联,则该值将由
put
方法返回。以下是
HashMap
源代码中的一个片段:

for(条目e=table[i];e!=null;e=e.next){
对象k;
如果(e.hash==hash&((k=e.key)==key | | key.equals(k))){
V oldValue=e.value;
e、 价值=价值;
e、 记录存取(本);
返回旧值;
}
}

是的,没错。一个简单的测试会告诉你:

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));
整数a=新整数(1);
整数b=新的整数(1);
Map Map=newhashmap();
地图放置(“键”,a);
地图放置(“键”,b);
System.out.println(“值为b:+(map.get(“key”)==b”);

我相信你是对的。您可以使用如下代码检查此问题:

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");
Map strsMap=newhashmap();
字符串myString1=新字符串(“mystring”);
字符串myString2=新字符串(“mystring”);
strsMap.put(“str”,myString1);
System.out.println(myString1==strsMap.put(“str”,myString2));
System.out.println(myString2==strsMap.get(“str”);

这不是问题所在。问题是:当键已经存在时,值会发生什么情况?这会被替换。即使值等于?比如@assylias,你也会指出我推理中的缺陷。语言没有留下解释的空间。而且你没有使用HashMap,这对我来说很重要,因为这不是Python或PHP允许使用引用实现替代规范。不过,为了保护使用HashMap的答案,这是一个接口问题,而不是实现细节,如果Map实现在这一点上模棱两可,那就太疯狂了。它将替换,这样可以“清除”System.properties()值;)javadoc是明确的:新值替换旧值,不管它们是相等的还是相同的。@assylias谢谢,“明确”是一个很好的表达方式,现在我看到该语言不允许进行相等检查。新的值替换旧的值,句号。如果它们相等,那就不重要了——它们可以互换。不。文档清楚地说:“将指定值与此映射中的指定键相关联”。如果在某些情况下,值实际上与键没有关联,文档会说明它。那么
Map
的其他实现又如何呢?示例证明不是证明。文档明确说明这是预期行为,如果该键存在值,则将替换该键,并返回旧值。但是为了完整起见,上面的代码为
HashMap
Hashtable
TreeMap
WeakHashMap
打印相同的内容,这些都是直接的实现。其他实现(见)扩展其中一个实现或使用组合/委派
EnumMap
IdentityHashMap
也有此行为。“我想说这是非常具体的。”文档中的SteveKuo:“如果映射之前包含键的映射,则旧值将替换为指定的值。”和:“返回:与
键相关联的前一个值,或者如果
键没有映射,则返回
null
”不这样做违反了接口约定,因此您可以在所有map实现中看到这种行为。是的,我知道文档中说的,但您的答案只不过是测试单个实现。
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");