有两个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)); } } }