2017-10-17 83 views
0

的考慮,我有被定義的驅動程序功能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,因此操作在mapfoo()將是對不同版本的map比原來的一個。 原因我的信念:

  1. this後,我們可以說,我們正在做的哈希表的shallow copy
  2. this文檔,其中可以清楚地表示:

參考數據類型參數,如對象,也傳遞到 方法由值。這意味着當方法返回時, 傳入引用仍然引用與之前相同的對象。 但是,如果對象的字段的值具有適當的訪問級別,則可以在 方法中更改對象字段的值。

因此,因爲我們是在做一個淺拷貝,在複製操作將最終改變傳遞的地圖,所有的變化在此通過地圖將反映在原始地圖,因爲2點

但我有一個矛盾的例子,質疑我的理解。那麼,我的想法是否正確?或者還有別的東西呢?

+2

我真的不跟着你不是String對象。複製意味着與英文相同的東西。如果您製作文檔的副本並修改副本,則原始文檔保持不變。這是副本的重點。所以不,對map2的更改不會使任何變換映射。順便說一下,你可以輕鬆地進行實驗和測試。 –

+4

淺層或深層複製在這裏並不重要:地圖只包含不可變的值。 –

+1

定義你所說的「改變傳遞圖」。如果你的意思是它的設定鍵/值,那麼他們不會爲'map2'當您添加或刪除'map'到/一鍵改變的意思。如果你指的是實際當你改變它們的狀態(例如通過set方法)時,鍵或值對象的狀態,那麼它們將會反映在兩個地圖中,因爲這兩個地圖都會引用相同的鍵/值對象 – tsolakp

回答

-2

從另一個地圖初始化一個HashMap不會導致淺表副本。新的地圖對象將擁有自己的數據表,因此刪除或添加條目不會影響兩個地圖。然而,在這兩個地圖鍵和值的對象將是相同的,從而對鍵和值對象的任何操作將是可見的兩個提供的對象都不是一成不變的和

+1

你所描述的正是淺拷貝。所以,是的,拷貝構造函數創建一個淺表副本。 –

+0

沒有@JBNizet。內部的HashMap維持其中包含鍵和值對象的數據表。數據表不淺複製。 –

+1

「從另一個地圖初始化一個HashMap不會導致淺copy「。絕對錯誤,不要在這裏引入'HashMap'的內部結構(這不叫'datatable')。 – Kayaman