首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >理解ArrayList中clear()背后的逻辑

理解ArrayList中clear()背后的逻辑
EN

Stack Overflow用户
提问于 2019-09-12 17:52:41
回答 4查看 74关注 0票数 5

我使用下面的程序在给定的列表中查找子序列。当我使用clear()时,li中的值也会被清除。因此,我每次都会创建一个新的引用。

我想了解这背后的逻辑。我用错了吗?或者它是我添加到li中的引用

代码语言:javascript
运行
复制
 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;

    }
EN

回答 4

Stack Overflow用户

发布于 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之前创建它

代码语言:javascript
运行
复制
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);
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-09-12 17:57:21

将元素添加到li不会生成副本。因此,当您调用clear()时,您将在li中同时拥有指向同一对象的temp和一个元素。

您可能只想在内部循环中声明temp,这样每次都会得到一个新的,而不需要调用clear()

票数 2
EN

Stack Overflow用户

发布于 2019-09-12 17:58:24

当您调用.clear() (或任何其他方法)时,您正在对相同的引用进行操作。在这里,如果不是每次迭代都创建一个新列表,那么就是将temp引用的列表添加到li中。当您调用clear()时,它们将被“全部”清除,因为它们都指向同一个对象。当您在每次迭代中创建一个新列表时,您拥有不同的对象,并且可以独立地对它们进行操作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57904124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档