亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

理解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 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號