解决JAVA遍历List集合,删除数据时出现的问题
作者:时间-海 发布时间:2021-12-25 15:38:03
标签:JAVA,遍历,list,集合,删除数据
一、问题描述
有时候,我们会遇到在遍历List集合的过程中删除数据的情况。
看着自己写的代码,感觉完全没有问题,但就是达不到预期的效果,这是为什么呢?下面我们来分析下
String str1 = new String("1");
String str2 = new String("2");
String str3 = new String("3");
String str4 = new String("4");
String str5 = new String("5");
List list = new ArrayList();
list.add(str1);
list.add(str2);
list.add(str3);
list.add(str4);
list.add(str5);
System.out.println("list.size()=" + list.size());
for (int i = 0; i < list.size(); i++) {
list.remove(i);
// i--;
//System.out.println(i+" "+list.get(i)+" ");
}
System.out.println("after remove:list.size()=" + list.size());
本来预期结果应该是:
list.size()=5
after remove:list.size()=0
但实际上结果却是:
list.size()=5
after remove:list.size()=2
原因如下: List每remove掉一个元素以后,后面的元素都会向前移动 ,此时如果执行i++,则刚刚移过来的元素没有被读取。
分析:
List中有5条数据,需要循环5次,
第一次数据为:1 2 3 4 5
执行完remove(0) 后,数据为 2 3 4 5 , i=1
第二次数据为:2 3 4 5
执行完remove(1) 后,数据为 2 4 5 , i=2
第三次数据为:2 4 5
执行完remove(2) 后,数据为 2 4 , i=3
此时如果加上上面注释的代码 System.out.println(i+" "+list.get(i)+" "); 循环第4、5次时就会出现异常
二、解决方法
解决方法1:每移过一次后,再把 i 移回来
for (int i = 0; i < list.size(); i++) {
list.remove(i);
i--;
}
解决方法2:先删除后面的元素
for (int i = list.size()-1; i >= 0; i--) { list.remove(i); }
解决方法3:使用iterator删除
for(Iterator it = list.iterator();it.hasNext();){
it.remove();
}
来源:https://www.cnblogs.com/wslook/p/9385815.html


猜你喜欢
- java 中Spark中将对象序列化存储到hdfs摘要: Spark应用中经常会遇到这样一个需求: 需要将JAVA对象序列化并存储到HDFS
- IDEA安装后,前进 后退快捷按钮默认不在工具栏显示,需要手动将其添加到工具栏*按照图一选中Toolbar Run Actions ,点击右
- SEATA概要seata 是alibaba 出的一款分布式事务管理器,他有侵入性小,实现简单等特点。我们能够使用seata 实现分布式事务管
- 要求: * 对用户输入的每个字符的值进行加密,将解密后的字符串输出 * 对用户输入的已加密字符串进行解密并
- Android 中下拉菜单,即如html中的<select>,关键在于调用setDropDownViewResource方法,以
- 本文为大家分享两个实例,相信大家一定会喜欢。实例1:随机生成验证码图片并将之输出为一个png文件效果图:import java.awt.Co
- 目录Java反射超详解1.反射基础1.1Class类1.2类加载2.反射的使用2.1Class对象的获取 2.2Construct
- Android实现分享长图并且添加全图水印前言:长图一般是ScrollView和ListView。 我们需要取得这两个控件的完整显示的图片。
- 一、返回值格式统一1.返回值介绍在使用controller对外提供服务的时候,很多时候都需要统一返回值格式,例如{"status&
- 本节我们主要介绍 Ribbon 的一些常用配置和配置 Ribbon 的两种方式。常用配置1. 禁用 Eureka当我们在 RestTempl
- 本文实例介绍了Android实现手机震动、抖动效果,分享给大家供大家参考,具体内容如下(1)布局文件如下<RelativeLayout
- 本文实例为大家分享了C语言实现简单版三子棋的具体代码,供大家参考,具体内容如下游戏的主函数设计:1.打印出可以让玩家选择游戏开始和退出的菜单
- 新建类Product:class Product{ public string name; &
- java.lang.OutOfMemoryError处理错误java.lang.OutOfMemoryError异常解决方法原因: 常见的有
- * 惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧!在项目中这种添加图片上传的效
- FastDFS简介FastDFS是一款开源的轻量级分布式文件系统,使用C实现,支持Linux、BSD等unix-like操作系统。值得注意的
- 前言Android暂时还没有提供一个合适的API来获取/监听键盘的状态和高度 , 而我们又经常会有这个需求.最近我的一个项目中,在ugc页面
- 本文实例讲述了C#操作ftp类。分享给大家供大家参考。具体如下:using System;using System.Collections.
- 简单理解泛型泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。通俗点将就是“类型的变量
- 有了上一节中得到的正则表达式,那么就可以用来构造 NFA 了。NFA 可以很容易的从正则表达式转换而来,也有助于理解正则表达式表示的模式。一