使用List中remove方法时需要注意的问题
		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);
		}原文出处:
[1] cbjcry, 使用List中remove方法时需要注意的问题, https://blog.csdn.net/cbjcry/article/details/70154568
注:转载后,已经重复验证了分析过程以及解决方案的正确与有效。
使用List中remove方法时需要注意的问题的更多相关文章
- List 调用 remove 方法时抛出 java.lang.UnsupportedOperationException 异常原因
		原因 使用 Arrays.asList(arr) 转换的 List 并不能进行 add 和 remove 操作. Arrays.asList(arr) 返回的类型是 Aarrays$Arr ... 
- 覆盖Django mysql model中save方法时碰到的一个数据库更新延迟问题
		最近有一个需求,通过django的admin后台,可以人工配置5张表的数据,这些数据进行一些业务规则处理后会统一成一份数据缓存在一个cache之中供服务端业务访问,因而任何一张表的数据更新(增.删.改 ... 
- 022——VUE中remove()方法的使用:
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解
		前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ... 
- Struts2 Action中的方法命名不要以get开头
		偶然发现,在调用一个action中的某个方法时,会自动调用另一个无关的方法,找了好久,最后发现是方法命名的问题,方法命名以get开头,action会自动调用!所以,以后再写action中的方法时尽量不 ... 
- react:在一个组件中调用别的组件中的方法
		先介绍一下要解决的问题:react中一个组件A和一个组件B,其中B是被connect(connect是redux中的方法)包装过的组件,包装成BContainer,A和BContainer的关系是兄弟 ... 
- html网页访问WebAPI中的方法遇到的问题
		1.移动端访问远程服务时,建议使用WebAPI 2.用不同浏览器访问WebAPI时返回的文本格式是不同的,Chrome Firefox将在浏览器中以XML形式显示此列表,IE浏览器将获得Json格 ... 
- Iterator的remove方法可保证从源集合中安全地删除对象(转)
		如果对正在被迭代的集合进行结构上的改变(即对该集合使用add.remove或clear方法),那么迭代器就不再合法(并且在其后使用该迭代器将会有ConcurrentModificationExcept ... 
- 遍历并remove HashMap中的元素时,遇到ConcurrentModificationException
		遍历并remove HashMap中的元素时,遇到ConcurrentModificationException for (Map.Entry<ImageView, UserConcise> ... 
随机推荐
- 函数内this指向+排序+找出数组大小项+Math类
			解决函数内this指向: 1,可以在函数外提前声明变量 _this/that = this 2,通过apply()和call()来修改函数内的this指向 二者区别: 用法是一样的,参数形式不一样 f ... 
- 数据库-如何创建SQL Server身份验证用户
			1.简介 默认安装SQL Server数据库后,SQL Server通过工具SQL Server Management Studio(SSMS)采用“Windows身份验证”方式登录,需要设置相应用户 ... 
- 渐进增强(progressive enhancement)、优雅降级(graceful degradation)
			渐进增强 progressive enhancement: 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果.交互等改进和追加功能达到更好的用户体验. 优雅降级 grace ... 
- js对数组array的常见操作小结
			1.创建数组?两种方式 var arr = new Array("1","2","4"); var arr1 = ["1" ... 
- SAP技术 - How to create a CDS redirect view for a given database table
			Scenario Suppose we have a database table A, and then we create a CDS redirect view B for it, then e ... 
- Golang: 解析JSON数据之二
			上次我们介绍了 Go 语言中序列化和反序列化 JSON 数据的两个方法 Marshal() 和 Unmarshal(),并以示例演示了它们的用法. 我们在例子中看到,需要事先声明好对应的结构体,才能跟 ... 
- Mac 提示错误”xcrun: error“
			错误现象: Mac 安装python模块时出现异常错误 xcrun: error: invalid active developer path (/Library/Developer/CommandL ... 
- 【Netty】Netty的Hello World程序之Discard Server
			一.有关Discard Server的说明 世界上最简单的协议(程序)不是“Hello, World!”而是Discard(丢弃).它是一种丢弃任何接收到的数据而没有任何响应的协议. 要实现丢弃协议, ... 
- 网络文件系统-NFS
			1. 什么是NFS NFS是 Network File System 的缩写,即网络文件系统.一种使用于分散式文件系统的协议,有Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的 ... 
- kafaka可视化工具kafkatool
			炒作就像动物世界的森林法则,专门攻击弱者,这种做法往往能够百发百中. ... 
