根據規範:「如果映射先前包含密鑰的映射,則舊值由指定值替換。」我想知道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