java中在for循环中remove元素时的陷阱

如下删除集合中值为“a”的元素时:

import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“1”的数据
		for (int i = 0; i < list.size(); i++) {
			if ("a".equals(list.get(i))) {
				list.remove(i);
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}

输出结果如下:

remove前集合数据:a,a,b,a,a,

remove后集合数据:a,b,a,

为什么会出现这种情况?原因是集合的大小是动态变化的,在删除第1个值为“a”的元素后,集合的大小已经发生了改变,但是i的值在删除后继续执行了加1操作,此时已经跳过了“a”元素后的元素(即原集合中第2个“a”元素)。

解决方法:

1、 在执行完remove操作后,对i的值进行减1操作,即修改后的代码如下:
import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“a”的数据
		for (int i = 0; i < list.size(); i++) {
			if ("a".equals(list.get(i))) {
				list.remove(i);
				i--;
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}

2、用迭代器的方式删除数据

import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List<String> list = new ArrayList<String>();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“a”的数据
		Iterator<String> iter = list.iterator();
		while (iter.hasNext()) {
			String temp = iter.next();
			if ("a".equals(temp)) {
				iter.remove();
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}





Java,使用foreach循环进行元素remove操作是不安全的,会导致ConcurrentModificationException异常。为了安全地删除元素,应该使用Iterator方式进行remove操作。\[1\]例如,可以使用Iterator的remove方法来删除元素,如下所示: ```java List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if ("2".equals(item)) { iterator.remove(); } } System.out.println(list); ``` 这样就可以安全地删除元素,避免了ConcurrentModificationException异常的发生。\[2\]另外,如果在并发操作使用Iterator,需要对Iterator对象进行加锁,以确保线程安全性。 #### 引用[.reference_title] - *1* *2* [java在foreach循环里进行元素remove/add操作](https://blog.csdn.net/lzxA304/article/details/110084587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [java在for循环remove元素陷阱](https://blog.csdn.net/lanmuhhh2015/article/details/78413279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值