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