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