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()方法才是真正意義上的拷貝。