java中集合删除元素的两种常用方式及新手易错

java中集合删除元素的两种常用方式及新手易错:

创建集合:

ArrayList<String> aList = new  ArrayList<String>();
		aList.add("a");
		aList.add("b");
		aList.add("c");
		aList.add("abc");
		aList.add("abc");
		aList.add("abc");
		aList.add("eye");
		aList.add("opp");
		aList.add("abc");

1、第一种删除方式(利用for循环删除):

for (int i = 0; i < aList.size(); i++) {
if ("abc".equals(aList.get(i))) {
aList.remove(i--);// 索引回溯
}
}

2、第二种删除方法(利用迭代器的remove()方法删除

ListIterator<String> listIterator = aList.listIterator();
	    while(listIterator.hasNext()){
	    	String  str = listIterator.next();
	    	if ("abc".equals(str)) {
			  //aList.remove(str);   // 集合自身的remove()方法删除
	    		listIterator.remove(); //迭代器的remove() 方法删除
			}
	    }

运行结果:

原集合:a b c abc abc abc eye opp abc 
删除后集合:a b c eye opp 


新手易错点:

1、利用for循环删除时索引没有回溯,导致漏删元素

for(int i = 0 ;i < aList.size(); i++){
			if("abc".equals(aList.get(i))){
				aList.remove(i);// 索引回溯
			}
		}

 
运行结果: 

原集合:a b c abc abc abc eye opp abc 
删除后集合:a b c abc eye opp 

2、使用迭代器循环删除元素时,没有利用迭代器remove方法删除元素而是利用集合自身的remove方法删除元素,

这样会导致“并发修改异常错误”

ListIterator<String> listIterator = aList.listIterator();
	    while(listIterator.hasNext()){
	    	String  str = listIterator.next();
	    	if ("abc".equals(str)) {
			    aList.remove(str);   // 集合自身的remove()方法删除
			}
	    }
运行结果:

原集合:a b c abc abc abc eye opp abc 
删除后集合:Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at practice_2.Mianpractice2.main(Mianpractice2.java:42)


并发修改异常错误的产生是因为在生成迭代器后迭代器就已经确定了集合的长度size了,而后集合删除元素后集合的size变小,但是迭代器任然记录的是之前的size数据在迭代过程中产生并发修改异常ConcurrentModificationException,但是如果是使用迭代器的remove()方法来删除元素的话则不会产出这个问题,因为迭代器中的cursor能够自动适应元素删除后集合大小的变化;

所以在删除集合元素时,如果适应迭代器来循环集合元素一定要使用迭代器自身的remove()方法来删除元素;







  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值