为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁花不似锦 2023-07-28 10:43:16
我正在使用下面的程序来查找给定列表中的子序列。当我使用 时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;    }
查看完整描述

4 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

不管你是否调用temp.clear(),如果你li多次添加对同一个List对象的引用,li将包含对同一个List对象的多个引用,这意味着li.get(0) == li.get(1),,li.get(0) == li.get(2)等等......


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


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


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);

    }

}


查看完整回答
反对 回复 2023-07-28
?
潇湘沐

TA贡献1816条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2023-07-28
?
白板的微信

TA贡献1883条经验 获得超3个赞

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



查看完整回答
反对 回复 2023-07-28
?
慕森卡

TA贡献1806条经验 获得超8个赞

尝试这样做:


public static int getTheSubseq(List<Integer> AList){

  //  int[][] subsequences = new int[][];

  List<List<Integer>> li = new ArrayList<>();

  List<Integer> temp;


  for (int i = 0; i < AList.size(); i++){

      for(int j =i+1; j < AList.size(); j++){

          temp = new ArrayList<>();

          temp.add(AList.get(i));

          temp.add(AList.get(j));

          li.add(temp);

      }

  }

  System.out.println(li);

  return 1;


}


查看完整回答
反对 回复 2023-07-28
  • 4 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信