List remove数据

如下操作:
		ArrayList<String> list1= new ArrayList<String>();
		initData(list1);

		
		for(String str:list1){
			if("name1".equals(str)){
				list1.remove(str);
			}
		}
这样遍历去移除一个对象,会抛出

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
	at java.util.AbstractList$Itr.next(AbstractList.java:343)
	at Main.main(Main.java:10


从API中可以看到List等Collection的实现并没有同步化,如果在多 线程应用程序中出现同时访问,而且出现修改操作的时候都要求外部操作同步化;调用Iterator操作获得的Iterator对象在多线程修改Set的时 候也自动失效,并抛出java.util.ConcurrentModificationException。这种实现机制是fail-fast,对外部 的修改并不能提供任何保证。那么我们如何正确地移除一个对象呢?

两种办法

第一种也是大多数初学者采用的办法。

int size = list1.size();
		int index = 0;
		for (int i = 0; i < size; i++) {
			if ("name2".equals(list1.get(i))) {
				index = i;
				break;
			}
		}
		list1.remove(index);

第二种,就是使用迭代器来处理:

		ArrayList<String> list1 = new ArrayList<String>();
		initData(list1);

		Iterator<String> iterator = list1.iterator();
		while (iterator.hasNext()) {
			String value = iterator.next();
			if ("name2".equals(value)) {
				iterator.remove();
				System.out.println(list1);
				break;
			}

		}

Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException ,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator  remove() 方法是个安全的做法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值