java之List集合調用remove方法慎用


有個業務,就是想要通過遍歷把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);
}

  

 報索引越界:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM