遍历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();
}
遍历List集合时,删除数据的问题的更多相关文章
- 遍历List集合,删除符合条件的元素
List集合的遍历有三种方式:增强for循环,普通for循环,Iterator迭代器遍历 如果只是对集合进行遍历,以上三种循环都可正常遍历: (1)增强For循环遍历List集合 List<St ...
- 用<forEach>遍历list集合时,提示我找不到对象的属性
<c:forEach items="${list}" var="item"> <tr> <td>${item.UserId} ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_06 Properties集合_1_使用Properties集合存储数据,遍历取出集合中的数据
map下面的实现类叫做Hashtable Properties是唯一和IO流相结合的 讲解 代码
- Java动态 遍历List 时删除List特征元素 异常问题 及解决方案总结
首先.这是一个极其简单的问题,大牛可忽略.新手可能会遇到,Java中遍历某个List 时删除该List元素 会抛出异常. 这一个简单的问题再高手严重不值一提,但新手可能会比較困惑,用哪种方式能够安全有 ...
- List遍历时删除遇到的问题
这周在开发中遇到了一个以前没遇到的小Bug,在这里记录下来. List集合,我们平时都经常使用.但是,我在遍历List集合时,调用了List集合的remove方法来删除集合中的元素,简单的代码结构是这 ...
- Sql Server有主外键关系时添加、删除数据
当表之间有主外键关系时删除数据会被约束,添加.删除失败 解决办法,我们可以先把主外键关系的检查约束给关掉 → 然后删除数据 → 之后再把约束打开 查询出关掉所有外键约束的语句 SELECT 'ALTE ...
- foreach 改变集合时不能使用
使用foreach循环遍历list集合时,出现Collection was modified; enumeration operation may not execute.这个错误,查了半天才发现是当 ...
- Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题
一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List<SalaryAdjustm ...
- java 集合list遍历时删除元素
本文探讨集合在遍历时删除其中元素的一些注意事项,代码如下 import java.util.ArrayList; import java.util.Iterator; import java.util ...
随机推荐
- 微信小程序(1)——小程序的特点以及结构
简单的,用完即走的应用 低频应用 性能要求不高的应用 应用程序入口(app.js app.json app.wxss) 一级页面:wxml,wxss,js,json 二级页面:wxml,wxss ...
- Tornado之实例和扩展
1.Tornado文件的结构: 1.Controllers控制器 2.Models数据库操作 3.Views前端显示 2.样例 #!/usr/bin/env python # -*- coding: ...
- “RPC好,还是RESTful好?”
REST 和 RESTful 什么区别?REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful ...
- Let’s Encrypt 将于 2018 年免费提供通配符证书
旨在让每个网站都启用 HTTPS 加密的 Let's Encrypt CA 宣布将于 2018 年 1 月免费提供通配符证书(Wildcard certificate).通配符证书是一种可被多个子域使 ...
- 如何把SQLServer数据库从高版本降级到低版本
如何把SQLServer数据库从高版本降级到低版本 编写人:CC阿爸 2015-4-7 近期在给一个客户推行ECM系统时,基本客户的硬件环境,我们为其安装的为SQL2008 64位的数据库系统.在安装 ...
- json对象转换
String modules =...; //json格式的String对象 //String对象转换为JSON格式数组 JSONArray moduleArr=JSONObject.parseArr ...
- MapReduce启动的Map/Reduce子任务简要分析
对于Hadoop来说,是通过在DataNode中启动Map/Reduce java进程的方式来实现分布式计算处理的,那么就从源码层简要分析一下hadoop中启动Map/Reduce任务的过程. ...
- iframe显示跨域url页面
可以通过JS搞定跨域问题,但是比较麻烦,我就在后台处理了,其实这样本质上也算不上是跨域了 后台otherwebsite.php: <?php $url="www.otherwebsit ...
- python学习(二十二) String(上)
str1 = "This is a 'test'" print(str1) str1 = 'This is a "test"' print(str1) str1 ...
- C# List泛型转换,int,string 转字符,转数组
List转字符串 List<string> List = new List<string>(); string strArray = string.Join(",&q ...