我是靠谱客的博主 野性草莓,最近开发中收集的这篇文章主要介绍满足某个条件时,移除list中的某个元素,导致的循环报错问题。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

满足某个条件时,移除list中的某个元素,导致的循环报错问题。

如下示例代码:

public static void main(String[] args){
		//构建list
	    List<String> list = new ArrayList<String>();
	    list.add("苹果");  //向列表中添加数据
	    list.add("草莓");  //向列表中添加数据
	    list.add("香蕉");  //向列表中添加数据
	    System.out.println("未remove元素前:"+list.toString()+"----->list大小:"+list.size());
	    //普通for循环移除元素,返回list
	    System.out.println("普通for循环");
	    for(int i=0;i<list.size();i++){
	    	System.out.println("获取元素下标为:"+i+"元素值为:"+list.get(i));
	    	if("草莓".equals(list.get(i))){
	    		System.out.println("remove元素前:"+list.get(i));
	    		list.remove(i);
	    		System.out.println("remove元素后:"+list.get(i));
	    		i--;
	    		
	    	}
	    }
	    System.out.println("未remove元素后:"+list.toString()+"----->list大小:"+list.size());
	}

执行上面代码输出结果如下:

未remove元素前:[苹果, 草莓, 香蕉]----->list大小:3
普通for循环
获取元素下标为:0元素值为:苹果
获取元素下标为:1元素值为:草莓
remove元素前:草莓
remove元素后:香蕉
获取元素下标为:1元素值为:香蕉
未remove元素后:[苹果, 香蕉]----->list大小:2

关键点:
1、list集合的元素是可重复的
2、list底层是基于数组实现的

分析原因:
list在执行了remove方法后,当前元素i会从数组中移除,且后面的元素会自动往前移,数组下标会自动减1。
因此对元素 i 执行了remove方法后,若不对当前循环进行i–操作,那么第 i +1 个元素就会移动到第 i 个元素的位置,从而使 第i+1 个元素错过循环;

测试如下代码:

public static void main(String[] args){
		//构建list
	    List<String> list = new ArrayList<String>();
	    list.add("苹果");  //向列表中添加数据
	    list.add("草莓");  //向列表中添加数据
	    list.add("香蕉");  //向列表中添加数据
	    System.out.println("未remove元素前:"+list.toString()+"----->list大小:"+list.size());
	    //普通for循环移除元素,返回list
	    System.out.println("*****************普通for循环*************");
	    for(int i=0;i<list.size();i++){
	    	System.out.println("获取元素下标为:"+i+"元素值为:"+list.get(i));
	    	if("草莓".equals(list.get(i))){
	    		System.out.println("remove元素前:"+list.get(i));
	    		list.remove(i);
	    		System.out.println("remove元素后:"+list.get(i));
	    		i--;
	    		
	    	}
	    }
	    System.out.println("未remove元素后:"+list.toString()+"----->list大小:"+list.size());
	    
	    System.out.println("*****************foreach循环*************");
	    //构建list2
	    List<String> list2 = new ArrayList<String>();
	    list2.add("苹果");  //向列表中添加数据
	    list2.add("草莓");  //向列表中添加数据
	    list2.add("香蕉");  //向列表中添加数据
	    System.out.println("未remove元素前:"+list2.toString()+"----->list2大小:"+list2.size());
	    for(String str:list2){
	    	System.out.println("获取元素值为:"+str);
	    	if("香蕉".equals(str)){
	    		System.out.println("remove元素前:"+str);
	    		list2.remove(str);
	    		System.out.println("remove元素后:"+str);
	    	}
	    }
	    System.out.println("未remove元素前:"+list2.toString()+"----->list2大小:"+list2.size());
	    
	    System.out.println("*****************iterator循环*************");
	    //构建list2
	    List<String> list3 = new ArrayList<String>();
	    list3.add("苹果");  //向列表中添加数据
	    list3.add("草莓");  //向列表中添加数据
	    list3.add("香蕉");  //向列表中添加数据
	    System.out.println("未remove元素前:"+list3.toString()+"----->list2大小:"+list3.size());
	    Iterator<String> iterator=list3.iterator();//实例化迭代器
	    while(iterator.hasNext()){
	    	String str=iterator.next();//读取当前集合数据元素
	    	System.out.println("获取元素值为:"+str);
	    	if("香蕉".equals(str)){
	    		System.out.println("remove元素前:"+str);
	    		iterator.remove();
	    		System.out.println("remove元素后:"+str);
	    	}
	    }
	    System.out.println("未remove元素前:"+list3.toString()+"----->list2大小:"+list3.size());
	}

总结:
1.foreach在循环移除元素时,当前一次循环内,remove前后当前元素不会改变
for循环,在循环移除元素时,当前一次循环内,remove后元素会立即变化,指向下一个元素;
iterator 移除元素后,会做期望值的修改,因此也不会报错

2.因此list移除元素时
优选iterator.remove(),不用做任何操作直接调用一处即可;
次选普通for循环,需要在每次remove之后i–操作;
foreach不可选;

最后

以上就是野性草莓为你收集整理的满足某个条件时,移除list中的某个元素,导致的循环报错问题。的全部内容,希望文章能够帮你解决满足某个条件时,移除list中的某个元素,导致的循环报错问题。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部