我需要從java HashMap中獲取一個集合,而不需要稍後在集合中反映的地圖中的更改。我想使用Collection.toArray()來實現這一點,但它不工作。由此產生的對象[]也在改變(javadocs說,返回的數組將會是「安全的」,因爲這個集合沒有引用它)。任何簡單的方法來實現這一點?如何從java HashMap獲取不可變集合?
回答
無法通過單個API調用完成此操作,您需要使用深度克隆。當您更改原始文件時,克隆不會被更改。這個主題已經在SO之前討論過,參見How to clone ArrayList and also clone its contents?和Deep clone utility recomendation。
我認爲這個答案可以擴展:「深層克隆」是什麼意思,這是如何防止修改或「共享引用」?一個鏈接可能是有用的... – 2012-01-28 06:14:51
@Perception:感謝您的編輯。 – 2012-01-28 06:21:40
Np,很好的答案。 – Perception 2012-01-28 06:27:22
然而,這並沒有說明* contained *對象的可變性。 – 2012-01-28 06:15:28
我相信谷歌收集Immutable Map是OP要找的東西。 @pst:通過閱讀文檔,我相信com.google.common.collect.ImmutableMap中包含的對象是不可變的。 – 2012-01-28 06:21:28
我的理解也是一樣的 – 2012-01-28 06:24:35
您可以創建一個不可修改Map
然而,這並沒有說明* contained *對象的可變性。 – 2012-01-28 06:14:09
更不用說原始地圖中的更改會反映在副本中。 – Perception 2012-01-28 06:16:07
我相信賈斯丁是對的。 'unmodifiableMap'方法將返回映射的只讀視圖,該視圖將反映對基本容器的任何更改,而sanre6並未指定所包含的對象應該是不可變的,只是映射應該是。 – Francois 2012-01-28 07:00:32
以下仍然有效,並說明所觀察到的問題(見上執行什麼樣的副本位)。然而,我沒有在上提供任何答案,如何執行深度複製。
相反,我的建議,是設計的對象是immutable,這完全避免了這個問題。根據我的經驗,對於大多數微不足道的對象(即不是「容器」的對象),它可以很好地工作,並且可以簡化代碼和推理。
從Javadoc文檔HashMap.values
:
返回包含在此映射中的值的Collection視圖。 收集是由地圖支持,所以更改地圖反映收集,反之亦然在...
也許這將有利於創造一個副本?
HashMap<K,V> map = ....;
List<V> values = new ArrayList<V>(map.values());
這實質上是執行「現在分開」的shallow-copy。但是,是淺拷貝,不包含所包含對象的克隆/副本。 (見βнɛƨнǤʋяʋиɢ的答案,如果deep-copy語義期望:這個問題本身似乎對此事有點含糊。)
快樂編碼
蒙山HashMap.clone()
創建原始地圖的淺表副本,然後檢索值從colleation那。這將在clone()
調用時創建對原始映射中對象的新引用;包含對象本身內部的明顯變化仍將反映在複製的集合中。如果你想要這種行爲,你唯一的方法就是在你想要的集合中複製地圖對象。
- 1. 如何從Java中的HashMap獲取值?
- 2. 如何將可變集合變爲不可變集合
- 3. 如何從HashMap獲取值?
- 4. 更新可變HashMap值,這是一個可變集合
- 5. 獲取從集合
- 6. 獲取從集合
- 7. 獲取從集合
- 8. 如何從hashmap的集合中獲得思想價值?
- 9. 如何從JSON數組獲取集合
- 10. 如何從集合中獲取對象?
- 11. 如何從集合中獲取mongodb
- 12. Firestore - 如何從DocumentSnapshot獲取集合?
- 13. 如何從mongoDB集合獲取數組?
- 14. 如何從forerunnerdb獲取集合名稱
- 15. 如何從集合中獲取Linq?
- 16. 可能從SortedMap獲取有序集合?
- 17. 從java中的hashmap/keyset獲取值?
- 18. Java Hashmap從對象鍵獲取值
- 19. 如何從Java集合
- 20. 如何從另一個集合中獲取對象集合?
- 21. 如何從嵌套Hashmap獲取數據?
- 22. 如何分別從HashMap獲取對象?
- 23. 混合對HashMap的可變引用和不可變引用
- 24. 在Java中使用HashMap作爲集合
- 25. Java HashMap和基礎值()集合
- 26. 如何從Java中的HashMap中獲取對象
- 27. 轉換不可變爲可變集合
- 28. 如何從集合中的集合中更好地獲取集合?
- 29. Java HashMap - 從HashMap獲取值,用戶輸入
- 30. 如何從集合A中獲取不在集合B中的元素?即AB
我沒有清楚地理解你想要達到的目標。但是LinkedHashMap是你在找什麼? – batbaatar 2012-01-28 05:48:51
不,插入順序不是我要找的。可以說我們有HashMap的。 Hashmap.values()會返回給我一個集合。現在HashMap中的任何更改都反映在這個集合中,這也是默認行爲。但是,我需要一個固定集合,其中映射的任何更改都不會反映出來 –
sanre6
2012-01-28 05:54:37
@ sanre6您的意思是更改* items *(objects)包含HashMap,偶然? – 2012-01-28 06:16:01