gpt4 book ai didi

java - 了解 ArrayList 中 clear() 背后的逻辑

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:28 27 4
gpt4 key购买 nike

我正在使用下面的程序来查找给定列表中的子序列。当我使用 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;

}

最佳答案

无论您是否正在调用 temp.clear(),如果您多次向 li 添加对同一 List 的引用> 对象,li 将包含对同一个 List 对象的多个引用,这意味着 li.get(0) == li.get(1)li.get(0) == li.get(2) 等等...

对这些内部 List 之一进行更改将反射(reflect)在所有其他内部 List 中,因为只有一个 List 被引用多次。

因此,在循环的每次迭代中(在将其添加到 li 之前)将新的 ArrayList 实例分配给 temp 是正确的做。

不过,我会稍作更改 - 在将新的内部 List 添加到外部 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);
}
}

关于java - 了解 ArrayList 中 clear() 背后的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904124/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com