删除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集合中的元素你碰到过这样的陷阱吗?的更多相关文章

  1. 删除 list 集合中的元素

    删除 list 集合中的元素,当删除的元素有多个的时候,只能使用迭代器来删除. 当删除 list 集合中的元素只有一个的时候,有三种方法都可以实现. import java.util.ArrayLis ...

  2. 如何删除JAVA集合中的元素

    经常我们要删除集合中的某些元素.有些可能会这么写. public void operate(List list){ for (Iterator it = list.iterator(); it.has ...

  3. 删除List集合中的元素方法

    List集合是我们平时使用的最多的集合了,一般用来存放从数据库中查询的对象数据,但有时我们会从中筛选不需要的数据,第一次使用这种方式: 使用增强for循环遍历,使用list的remove方法删除不符合 ...

  4. list,set等集合遍历时,不能remove集合中的元素。需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAll(list/set)操作

    list,set等集合遍历时,不能remove集合中的元素.需要new一个Object或者list,set,里面add需要删除的元素,等集合遍历完了进行remove(Object)或者removeAl ...

  5. AJPFX关于对集合中的元素删除操作和注意点

    import java.util.ArrayList;import java.util.Iterator;import java.util.List; public class ForeTest2 { ...

  6. Day_11【集合】扩展案例2_使用普通for循环获取集合中索引为3的元素并打印,统计集合中包含字符串"def"的数量,删除集合中的所有字符串",将集合中每个元素中的小写字母变成大写字母def",

    分析以下需求,并用代码实现 1.定义ArrayList集合,存入多个字符串"abc" "def" "efg" "def" ...

  7. Lambda 表达式遍历集合时用remove方法删除list集合中满足条件的元素问题

    一:循环遍历list集合的四种方式 简单for循环 iterator循环 增加for循环 Lanbda表达式 二:四种遍历方式的用法示例 //简单for循环 List<SalaryAdjustm ...

  8. c#---部分;把数组或者结构体存入集合里,然后再从集合中取出之后,输出;foreach既可以用到提取数组重点额数据,也可以提取集合中的数据(前提是集合中的元素是相同数据类型)

    1.输入班级人数,统计每个人的姓名,性别,年龄:集合与数组 //Console.Write("请输入班级人数:"); //int a = int.Parse(Console.Rea ...

  9. 巧妙利用ToArray()函数移除集合中的元素

    当我们对集合foreach遍历时,不能直接移除遍历的集合的元素,解决的方法有很多种,见我之前的随笔: http://www.cnblogs.com/527289276qq/p/4331000.html ...

随机推荐

  1. 使用docker来创建一个etcd集群

    docker run -d --name etcd1 --network etcdnet --ip 172.25.0.101 -p 23791:2379 -e ETCDCTL_API=3 -v /ro ...

  2. .net core 根据已有数据库创建实体Model

    这三个引用需要与.net core 版本一致,否则后续其他操作时会出错 可以到NuGET包中找到对应的版本然后添加,或者使用一下语句将版本号修改为.net core对应的版本然后执行 Install- ...

  3. windbg命令行选项

    我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式  windbg命令行使用以下语法: windbg [ -server Serv ...

  4. Redis存储字符串

    1.set和get实现字符串存取: 键的名字相同,会对以前的值进行覆盖: 2.++操作: 3.--操作: 4.加任意数值的数字: 5.减任意数值的数字: 6.拼接字符串: 7.删除:

  5. 27-ESP8266 SDK开发基础入门篇--编写Android SmartConfig一键配网程序

    style="font-size: 18pt;">https://www.cnblogs.com/yangfengwu/p/11429007.html https://wik ...

  6. mysql5.7 之 sql_mode=only_full_group_by问题

    在使用查询时,使用到了group by 分组查询,报如下错误: ERROR (): In aggregated query without GROUP BY, expression # of SELE ...

  7. ICEM-结构化网格interface的做法

    原视频下载地址:http://yunpan.cn/cLHTCfRVNmihZ  访问密码 2ead

  8. Linux 踢掉其他终端用户

    输入W查看信息 root@HAN:~# w 09:02:36 up 8 days, 20:10, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FRO ...

  9. 多线程 fork/join 并行计算

    1. 什么是Fork/Join框架 Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 我们再通过 ...

  10. 第09组 Beta冲刺(2/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:https://edu.cnblogs.com/campus/fzu/SoftwareEngineer ...