java将新元素添加到arraylist中

时间:2015-11-08 19:55:23

标签: java arraylist

我有以下代码解决问题“给定一组不同的整数,返回所有可能的子集。如果nums = [1,2,3],解决方案是[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]。”

public class Solution {
public ArrayList<ArrayList<Integer>> subsets(int[] num) {
    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
    if(num == null || num.length == 0) {
        return result;
    }
    ArrayList<Integer> list = new ArrayList<Integer>();
    Arrays.sort(num);  
    subsetsHelper(result, list, num, 0);

    return result;
}


private void subsetsHelper(ArrayList<ArrayList<Integer>> result,
ArrayList<Integer> list, int[] num, int pos) {

    result.add(new ArrayList<Integer>(list));

    for (int i = pos; i < num.length; i++) {
        list.add(num[i]);
        subsetsHelper(result, list, num, i + 1);
        list.remove(list.size() - 1);
    }
}

result.add(new ArrayList<Integer>(list))为什么我需要使用new ArrayList<Integer>(list))?我知道简单地使用result.add(list)会使结果中的项目完全相同,但我想知道原因。

1 个答案:

答案 0 :(得分:2)

new ArrayList<Integer>(list)

这称为copy constructor,&#34; 它用于创建同一类的现有对象的副本。&#34;

如果没有复制构造函数,每次调用result.add(list)都会将对相同列表的引用重复添加到result。使用复制构造函数,将创建一个使用当前值list的新列表。这样subsetHelper()可以重复修改list,而无需更改已存储在result中的列表。

确保您了解Java passes around method parameters的方式;它并不复杂,但成为一名有效的Java程序员至关重要。