Java中的List赋值问题


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

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM