我使用下面的程序在给定的列表中查找子序列。当我使用clear()时,li中的值也会被清除。因此,我每次都会创建一个新的引用。
我想了解这背后的逻辑。我用错了吗?或者它是我添加到li中的引用
public static int getTheSubseq(List<Integer> AList){
// int[][] subsequences = new int[][];
List<List<Integer>> li = new ArrayList<>();
List<Integer> temp = new ArrayList<>();
for (int i = 0; i < AList.size(); i++){
for(int j =i+1; j < AList.size(); j++){
temp.add(AList.get(i));
temp.add(AList.get(j));
li.add(temp);
temp = new ArrayList<>();
//temp.clear();
}
}
System.out.println(li);
return 1;
}发布于 2019-09-12 17:57:33
无论您是否调用temp.clear(),如果您多次向li添加对同一List对象的引用,li将包含对同一List对象的多个引用,这意味着li.get(0) == li.get(1)、li.get(0) == li.get(2)等等...
在其中一个内部List中进行更改将反映在所有其他内部List中,因为只有一个List被多次引用。
因此,在循环的每次迭代中(在将其添加到li之前)为temp分配一个新的ArrayList实例是正确的做法。
我做了一个小小的改变--在将新的内部List添加到外部List之前创建它
for (int i = 0; i < AList.size(); i++){
for(int j =i+1; j < AList.size(); j++){
List<Integer> temp = new ArrayList<>();
temp.add(AList.get(i));
temp.add(AList.get(j));
li.add(temp);
}
}发布于 2019-09-12 17:57:21
将元素添加到li不会生成副本。因此,当您调用clear()时,您将在li中同时拥有指向同一对象的temp和一个元素。
您可能只想在内部循环中声明temp,这样每次都会得到一个新的,而不需要调用clear()。
发布于 2019-09-12 17:58:24
当您调用.clear() (或任何其他方法)时,您正在对相同的引用进行操作。在这里,如果不是每次迭代都创建一个新列表,那么就是将temp引用的列表添加到li中。当您调用clear()时,它们将被“全部”清除,因为它们都指向同一个对象。当您在每次迭代中创建一个新列表时,您拥有不同的对象,并且可以独立地对它们进行操作。
https://stackoverflow.com/questions/57904124
复制相似问题