有個業務,就是想要通過遍歷把list集合中的數據刪除掉,如下做法是不可能把list集合刪除干凈的:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("ee"); /** * 下面遍歷操作過程如下: * i = 0 list.size() == 5 執行完第一次list.remove(0); list剩下[bb,cc,dd,ee] * i = 1 list.size() == 4 執行完第二次list.remove(1); list剩下[bb,dd,ee] * i = 2 list.size() == 3 執行完第三次list.remove(2); list剩下[bb,dd] * i = 3 list.size() == 2 i > list.size()所以條件不滿足,最后剩下[bb,dd] */ for (int i = 0; i< list.size(); i++) { list.remove(i); } System.out.println(list); // 最終打印出來的結果是[bb,ee] }
再有這種也是不行的,如:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("ee"); /** * 下面遍歷操作過程如下: * i = 0 list.size() == 5 執行完第一次list.remove(0); list剩下[bb,cc,dd,ee] * i = 1 list.size() == 4 執行完第二次list.remove(0); list剩下[cc,dd,ee] * i = 2 list.size() == 3 執行完第三次list.remove(0); list剩下[dd,ee] * i = 3 list.size() == 2 i > list.size()所以條件不滿足,最后剩下[dd,ee] */ for (int i = 0; i< list.size(); i++) { list.remove(0); } System.out.println(list); // 最終打印出來的結果是[bb,ee] }
關鍵點就是因為每次list.size()都會重新計算長度才會導致問題出現
於是解決問題就是提取獲取長度的關鍵點出來如下:
public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); list.add("dd"); list.add("ee"); /** * 下面遍歷操作過程如下: * i = 0 len == 5 執行完第一次list.remove(0); list剩下[bb,cc,dd,ee] * i = 1 len == 5 執行完第二次list.remove(0); list剩下[cc,dd,ee] * i = 2 len == 5 執行完第三次list.remove(0); list剩下[dd,ee] * i = 3 len == 5 執行完第四次list.remove(0); list剩下[ee]
* i = 4 len == 5 執行完第五次list.remove(0); list剩下[] */ int len = list.size(); // 保證只獲取一次長度 for (int i = 0; i< len; i++) { list.remove(0); } System.out.println(list); // 最終打印出來的結果是[bb,ee] }
特別注意的是:
如果是這樣就會報錯了
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
/**
* 只求取list.size()長度一次
* i == 0 len == 5 list.remove(0) list剩下["bb","cc","dd","ee"]
* i == 1 len == 5 list.remove(1) list剩下["bb", "dd","ee"]
* i == 2 len == 5 list.remove(2) list剩下["bb","dd"]
* i == 3 len == 5 list.remove(3) list因為沒有第四個元素,於是報索引越界錯誤
*/
int len = list.size();
for (int i = 0; i < len; i++) {
list.remove(i);
}
System.out.println(list);
}
報索引越界: