ArrayList的ArrayList是否存储引用?

时间:2013-08-17 23:13:11

标签: java arraylist

我正面临着处理Arraylist的Arraylist的问题。每当我在代码中清除Arraylist al时,ans变量也会发生变化。我知道它是通过引用存储的。知道如何解决这个问题吗?我的代码如下:

public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
    ArrayList<ArrayList<Integer>> ans = new ArrayList();
    ArrayList<Integer> al = new ArrayList();
    Queue<TreeNode> myQ = new LinkedList();
    if(root == null)
        return ans;
    myQ.add(root);
    myQ.add(null);
    TreeNode temp;
    while(!myQ.isEmpty()){
        temp = myQ.remove();
        if(temp == null){
            ans.add(al);
            System.out.println("al is: " + al);
            System.out.println("    ans is: " + ans);
            al.clear();
            System.out.println("            ans is: " + ans);
            if(myQ.isEmpty())
                break;
            myQ.add(null);
        }
        else{
            al.add(temp.val);
            if(temp.left != null)
                myQ.add(temp.left);
            if(temp.right != null)
                myQ.add(temp.right);
        }
    }
    //System.out.println(ans);
    return ans;        
} 

由于

1 个答案:

答案 0 :(得分:2)

您的代码只使用new关键字创建两个ArrayLists。一个存储在ans中,另一个存储在al中。对第二个的引用被插入第一个,但由于它是同一个对象,因此效果是元素是“共享的”。

要避免此共享,您需要为每个元素创建不同的ArrayList。不是清除al,而是使用new ArrayList<Integer>()创建一个新的ArrayList,并将其分配给al