有兩個List a 和b ,如果要把a中的全部元素都賦值給b,應該怎么做呢?你是不是想:這很簡單 b=a就完事兒了。然而,接下來會出現問題,如果a中的元素發生改變了,b也隨之改變了。看看以下這個簡單示例:
List <Object> a= new ArrayList<>(); a.add("a"); a.add("b"); a.add("c"); List <Object> b= new ArrayList<>(); b=a; System.out.println(a); a.remove(0); System.out.println(b);
輸出結果是a=[a, b, c],b=[b, c],也就是說我們改變了a,卻導致了b跟着改變了。
那有什么辦法可以使得a的改變不影響b嗎?方法很簡單:
List <Object> a= new ArrayList<>(); a.add("a"); a.add("b"); a.add("c"); List <Object> b= new ArrayList<>(a); System.out.println(a); a.remove(0); System.out.println(b);
如果a里還嵌套着一個List c,那么用上面這種方法還是會有問題,因為如果c里的元素改變了,也會導致b里的c元素改變。如果a里除了有List c還有其他List,或者List c里還嵌套着下層List,那就更復雜了。這時可用遞歸的方法來把a的值全部復制給b,代碼如下:
public static void main(String[] args) { List <Object> a= new ArrayList<>(); List <String> c=new ArrayList<>(); c.add("d"); c.add("e"); a.add("a"); a.add("b"); a.add("c"); a.add(c); List <Object> b= new ArrayList<>(); mcopy(b,a); //遞歸復制 System.out.println("a="+a); a.remove(0); c.remove(0); System.out.println("b="+b); } /* 遞歸復制List */ private static void mcopy(List<Object> b, List<Object> a) { for(int i=0;i<a.size();i++) { if(a.get(i) instanceof String) { b.add(a.get(i)); } else if(a.get(i) instanceof List){ b.add(new ArrayList <Object>()); mcopy((List)b.get(i),(List)a.get(i)); } } }
