[轉]Java復制Map對象(深拷貝與淺拷貝)


1.深拷貝與淺拷貝

  淺拷貝:只復制對象的引用,兩個引用仍然指向同一個對象,在內存中占用同一塊內存;

  被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象;

  換言之,淺復制僅僅復制所考慮的對象,而不復制它所引用的對象。

  深拷貝:被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量;

  那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象;

  換言之,深復制把要復制的對象所引用的對象都復制了一遍。

2.通過putAll()方法能夠實現淺拷貝與深拷貝

  使用Map對象只能實現淺拷貝

public static void main(String[] args) {
    // Map只能實現淺拷貝,paramMap中的內容發生變化,paramMap2中的內容亦同步發生變化
    Map<String, String> paramMap = new HashMap<String, String>();
    paramMap.put("name", "Marydon");
    Map<String, String> paramMap2 = new HashMap<String, String>();
    // 實現淺拷貝方式一:使用=
    paramMap2 = paramMap;
    paramMap.remove("name");
    System.out.println(paramMap2);//{}
    // 實現淺拷貝方式二:使用Map.putAll()
    paramMap2.putAll(paramMap);
    paramMap.remove("name");
    System.out.println(paramMap2);//{}
}

  使用HashMap對象可是實現深拷貝

public static void main(String[] args) {
    // HashMap可以實現真正意義上深拷貝,注意不是Map
    HashMap<String, String> paramMap = new HashMap<String, String>();
    paramMap.put("name", "Marydon");
    HashMap<String, String> paramMap2 = new HashMap<String, String>();
    // 實現深拷貝:使用HashMap.putAll()
    paramMap2.putAll(paramMap);
    paramMap.remove("name");
    System.out.println(paramMap2);// {name=Marydon}
}

3.小結

  實現淺拷貝的方式有兩種:=和Map.putAll();

  實現深拷貝:HashMap.putAll()。

  大多數情況下,我們需要實現的是深拷貝而不是淺拷貝;

  使用Map調用putAll()方法,並不是真正意義上的拷貝,Map對象B只是對Map對象A進行了引用,當Map對象A中的內容發生變化時,Map對象B也會發生變化;

  使用HashMap調用putAll()方法才是真正意義上的拷貝。

 

轉摘於:https://blog.csdn.net/weixin_34357928/article/details/85994745


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM