删除List集合中的元素你碰到过这样的陷阱吗?
删除List的三种方式:
(1) 普通遍历 :
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//1. 普通遍历删除 list 中元素
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("one")){
list.remove(i);
}
System.out.println(list.get(i));
}
//result : 普通遍历:删除成功
}
(2) 增强for 循环:
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//2. 增强for循环 删除list中元素
for (String str : list){
if (str.equals("one")){
list.remove("one");
}
System.out.println(str);
}
//result : 抛出异常 -> ConcurrentModificationException
}
(3) 迭代器遍历:
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//3. 迭代器遍历 删除 list中元素
Iterator<String> listIter = list.iterator();
while (listIter.hasNext()){
String next = listIter.next();
if ("one".equals(next)){
listIter.remove();
}
System.out.println(next);
}
//result : 迭代器遍历 删除成功
}
}
总结:
(1)普通遍历 :在代码中,删除元素后,需要把下标减一。这是因为在每次删除元素后,ArrayList会将后面部分的元素依次往上挪一个位置(就是copy),所以,下一个需要访问的下标还是当前下标,所以必须得减一才能把所有元素都遍历完;<for循环适合删除特定一位元素,不适合循环删除特定元素>
(2)增强for循环:不能删除,抛出异常ConcurrentModificationException<list集合在使用中,对象不能发生改变,所以会抛出异常>;
(3)迭代器遍历:正常删除。
迭代器可以正常删除的原因:
迭代器删除元素时,是先使用next()获取元素,然后再remove()删除元素,但是如果next()和remove()之间,集合发生机构性变化(增加,删除)则会抛出IllegalStateException,是因为读完next(),迭代器的位置已经指向下一个,位置不再指向当前元素所在位置。
集合出现了结构性变化(删除或者是增加)则会出现异常IllegalStateException。
删除List集合中的元素你碰到过这样的陷阱吗?的更多相关文章
- 删除 list 集合中的元素
删除 list 集合中的元素,当删除的元素有多个的时候,只能使用迭代器来删除. 当删除 list 集合中的元素只有一个的时候,有三种方法都可以实现. import java.util.ArrayLis ...
- 如何删除JAVA集合中的元素
经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...
- 删除List集合中的元素方法
List集合是我们平时使用的最多的集合了,一般用来存放从数据库中查询的对象数据,但有时我们会从中筛选不需要的数据,第一次使用这种方式: 使用增强for循环遍历,使用list的remove方法删除不符合 ...
- list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作
list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...
- AJPFX关于对集合中的元素删除操作和注意点
import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...
- Day_11【集合】扩展案例2_使用普通for循环获取集合中索引为3的元素并打印,统计集合中包含字符串"def"的数量,删除集合中的所有字符串",将集合中每个元素中的小写字母变成大写字母def",
分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串"abc" "def" "efg" "def" ...
- Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题
一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List<SalaryAdjustm ...
- c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)
1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...
- 巧妙利用ToArray()函数移除集合中的元素
当我们对集合foreach遍历时,不能直接移除遍历的集合的元素,解决的方法有很多种,见我之前的随笔: http://www.cnblogs.com/527289276qq/p/4331000.html ...
随机推荐
- Educational Codeforces Round 67
Educational Codeforces Round 67 CF1187B Letters Shop 二分 https://codeforces.com/contest/1187/submissi ...
- Ajax.BeginForm 不执行OnSuccess
今天用MVC做了一个表单提交,使用Ajax.BeginForm ,但是碰到一个奇怪的问题OnSuccess回调函数不执行.后来经过多次尝试才发现要引用两个东西 1.<script src=&qu ...
- 【POJ1573】Robot Motion
题目传送门 本题知识点:模拟 本题的题意也很简单. 给出一个矩阵,矩阵里面有着东南西北(上下左右)的指示,当机器人走到上面时则会按照指示前进.机器人每次都从最上面一行的某一列进入. 需要判断的是机器人 ...
- tengine负载均衡高可用配置
环境 Tengine-master:192.168.109.100 Tengine-slave:192.168.109.101 tomcat01:192.168.109.102 tomcat02:19 ...
- ARC063F すぬけ君の塗り絵 2 / Snuke's Coloring 2
题面 一句话题面:给你一些点,求这些点之中夹的最大的矩形周长.(考虑边界) Solution 首先是一个结论,答案矩形一定经过\(x=\frac{w}{2}\)或经过\(y=\frac{h}{2}\) ...
- SSH框架整合2
===========================================web.xml================================================== ...
- [C++] namespace命名空间和using用法
命名空间namespace:指标识符的各种可见范围. C++标准程序库中的所有标识符都被定义在一个std的namespace,这就是程序开始添加 using namespace std; 的原因. 很 ...
- pyqt5设置背景图片出现问题
在使用pyqt5时,用qtdesign设置好背景图片,如何设置自行百度,预览没问题,用ptuic5转换为代码却发现显示不了: 首先:我在qtdesign中导入的是pic.qrc,但是转换的代码最后一句 ...
- elasticsearch jestclient api
1.es search sroll 可以遍历索引下所有数据 public class TestDemo { @Test public void searchSroll() { JestClientFa ...
- Cucumber介绍
Cucumber是一个提供能让我们都理解的普通语言,通过普通语言来描述的测试用例,并支持行为驱动开发的测试工具.Cucumber支持大多数变成语言,如Ruby.Java和Python等. 官方地址:h ...