的考慮,我有被定義的驅動程序功能foo()
如下:範圍淺層複製
void foo()
{
Map<Integer,Character> map = new HashMap<Integer,Character>() ;
bar(map)
//operations on map
}
void bar(Map<Integer,Character> map)
{
Map<Integer,Character> map2 = new HashMap<Integer,Character>(map) ;
//operations over map2
}
現在,據我所知,在map2
操作應改變原來的map
,因此操作在map
內foo()
將是對不同版本的map
比原來的一個。 原因我的信念:
- 據this後,我們可以說,我們正在做的哈希表的shallow copy。
- 在this文檔,其中可以清楚地表示:
參考數據類型參數,如對象,也傳遞到 方法由值。這意味着當方法返回時, 傳入引用仍然引用與之前相同的對象。 但是,如果對象的字段的值具有適當的訪問級別,則可以在 方法中更改對象字段的值。
因此,因爲我們是在做一個淺拷貝,在複製操作將最終改變傳遞的地圖,所有的變化在此通過地圖將反映在原始地圖,因爲2點
但我有一個矛盾的例子,質疑我的理解。那麼,我的想法是否正確?或者還有別的東西呢?
我真的不跟着你不是String對象。複製意味着與英文相同的東西。如果您製作文檔的副本並修改副本,則原始文檔保持不變。這是副本的重點。所以不,對map2的更改不會使任何變換映射。順便說一下,你可以輕鬆地進行實驗和測試。 –
淺層或深層複製在這裏並不重要:地圖只包含不可變的值。 –
定義你所說的「改變傳遞圖」。如果你的意思是它的設定鍵/值,那麼他們不會爲'map2'當您添加或刪除'map'到/一鍵改變的意思。如果你指的是實際當你改變它們的狀態(例如通過set方法)時,鍵或值對象的狀態,那麼它們將會反映在兩個地圖中,因爲這兩個地圖都會引用相同的鍵/值對象 – tsolakp