根据规范:“如果映射先前包含密钥的映射,则旧值由指定值替换。”我想知道value.equals(旧值)但value!=旧值的情况。我对规范的阅读是旧的价值必须被替代。是对的吗?java.util.Map.put(key,value) - 如果值等于现有值,该怎么办?
回答
如果新密钥与现有密钥匹配,则映射值将被替换,而不管其值如何,例如,即使oldValue.equals(newValue)
是true
。
我不认为我们需要看看源,还是要靠测试代码:这是从Map.put
,我们在哪里找到的文件明确:
如果映射以前包含了一个映射键,旧值被指定值替换。 (当且仅当m.containsKey(k)将返回true时,映射m才被认为包含关键字k的映射。)
这不是问题。问题是:当密钥已经存在时,该值会发生什么?这被替换。即使价值是相等的? –
像@assylias,你指出我的推理有缺陷。该语言没有留下解释的余地。并且你没有使用HashMap,这对我很重要,因为这不是Python或PHP,允许参考实现作为规范的替代品。尽管如此,为了保护使用HashMap的答案,这是一个接口事物,而不是实现细节,如果Map实现在这一点上含糊不清,那将是疯狂的。 – philo
是的,你的理解是正确的,如果在map
中存在相同的值键,它将被替换为新值。
没有检查值相等性,仅针对关键相等。如果您指定的键与已经在地图中的键相匹配,则该对象将被替换为相等。
如果一个值先前与密钥相关联,则该值将由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;
}
}
是的,没错。一个简单的测试会告诉你:
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));
但是你真的只是测试一个实现,对吧? – philo
不可以。文档中明确指出:“将指定值与此映射中的指定键相关联”。如果有些情况下这些值实际上与密钥不相关,那么文档就会说明它。 –
我相信你是对的。你可以用这样的代码来检查它:
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”的其他实现呢?通过举例证明不是一个证明。 –
该文档明确指出这是预期的行为,如果该键的值存在,它将被替换,并且旧值将被返回。但为了完整性,上面的代码为'HashMap','Hashtable','TreeMap'和'WeakHashMap'打印相同的东西,这是直接的实现。其他实现(在文档顶部(http://docs.oracle.com/javase/6/docs/api/java/util/Map.html))可以扩展这些实现之一或使用组合/代表团。 'EnumMap'和'IdentityHashMap'也有这种行为。我会说这很具体。 – Brian
@SteveKuo从文档:“如果映射先前包含该键的映射,则旧值由指定值替换。”并且:“**返回:**与'key'有关的前一个值,如果没有'key'的映射,则返回'null'”。不这样做是违反了接口契约,所以你可以期待在所有地图实现中的这种行为。 – Brian
- 1. array_push key =>值,该怎么办?
- 2. 如果_POSIX_VDISABLE值为-1,该怎么办?
- 3. 存储值,如果值等于key
- 4. 如果对象在Handlebars.js中只有一个值,该怎么办?
- 5. 如果字典中的语句打印一个键和值,如果该值大于一,我该怎么办?
- 6. 命名值:如果2个值具有相同名称,该怎么办?
- 7. os.putenv(key,value)和os.environ [key] = python中的值有什么区别?
- 8. 如果UpperBound列值为空,该怎么办?
- 9. 如果我们想允许在concuurentHashMap中用putIFAbsent覆盖值,该怎么办?
- 10. Pyspark(key,value)对与(key,[值列表])
- 11. 如果被等待的线程自行分离,该怎么办?
- 12. 如果抛出IOException,我该怎么办?
- 13. 如果setuptools未安装,该怎么办?
- 14. 如果google.load失败,该怎么办?
- 15. 如果DBCursor未关闭,该怎么办?
- 16. 如果mysql_query()失败,该怎么办?
- 17. 如果collections.defaultdict不可用,该怎么办?
- 18. 如果我的JavaScript变量在mvc3中的值有at-sign,该怎么办?
- 19. 如果订单字段的值与所有记录相同,该怎么办?
- 20. PHP - 如果值等于
- 21. 如果我想在内存缓存中存储一个None值,该怎么办?
- 22. Ruby key&Value?
- 23. 如果我的servlet中出现IOException,我该怎么办?
- 24. 如果Hibernate的表中没有ID列,该怎么办?
- 25. Session.Add(“key”,value)和Session [“key”] = value之间有什么区别?
- 26. Mystery Key Value Coding Key
- 27. Key Value Observing Cascading
- 28. javafx中是否有SimpleLOngProperty,如果没有,那该怎么办?
- 29. 指数值没有显示,我该怎么办?
- 30. PHP - 如何将数组从(Key,Value)转换为(Key,Value,Value)?
是。你是对的。 –
它将取代并以这种方式可以“清除”System.properties()值;) – 2012-09-25 17:53:51
javadoc是明确的:新值替换旧值,不管它们是相等还是相同。 – assylias