概述
满足某个条件时,移除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中的某个元素,导致的循环报错问题。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复