猿问

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

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


    }


繁花不似锦
浏览 124回答 4
4回答

qq_笑_17

不管你是否调用temp.clear(),如果你li多次添加对同一个List对象的引用,li将包含对同一个List对象的多个引用,这意味着li.get(0) == li.get(1),,li.get(0) == li.get(2)等等......对这些内部之一进行更改List将反映在所有其他内部List,因为只有一个List被多次引用。因此,在循环的每次迭代中(在将其添加到 之前)分配一个新ArrayList实例是正确的做法。templiList不过,我会做一些小小的改变 - 在将新的内部添加到外部之前创建新的内部List:for (int i = 0; i < AList.size(); i++){&nbsp; &nbsp; for(int j =i+1; j < AList.size(); j++){&nbsp; &nbsp; &nbsp; &nbsp; List<Integer> temp = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; temp.add(AList.get(i));&nbsp; &nbsp; &nbsp; &nbsp; temp.add(AList.get(j));&nbsp; &nbsp; &nbsp; &nbsp; li.add(temp);&nbsp; &nbsp; }}

潇湘沐

添加元素li不会生成副本。因此,当您调用时,clear()您将拥有两个指向同一个对象的temp元素和其中的一个元素。li您可能只想temp在内循环中进行声明,这样您每次都会得到一个新的循环,而无需调用clear().

白板的微信

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

慕森卡

尝试这样做:public static int getTheSubseq(List<Integer> AList){&nbsp; //&nbsp; int[][] subsequences = new int[][];&nbsp; List<List<Integer>> li = new ArrayList<>();&nbsp; List<Integer> temp;&nbsp; for (int i = 0; i < AList.size(); i++){&nbsp; &nbsp; &nbsp; for(int j =i+1; j < AList.size(); j++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp = new ArrayList<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp.add(AList.get(i));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; temp.add(AList.get(j));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; li.add(temp);&nbsp; &nbsp; &nbsp; }&nbsp; }&nbsp; System.out.println(li);&nbsp; return 1;}
随时随地看视频慕课网APP

相关分类

Java
我要回答