删除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 ...
随机推荐
- Basic concepts of docker/kubernete/kata-container
Kubereters An open-source system for automating deployment, scaling, and management of containerized ...
- Chirp信号及其生成
Chirp信号是一个典型的非平稳信号,在通信.声纳.雷达等领域具有广泛的应用. 简介 Chirp译名:啁啾(读音:“周纠”),是通信技术有关编码脉冲技术中的一种术语,是指对脉冲进行编码时,其载频在脉冲 ...
- 【洛谷P4093】 [HEOI2016/TJOI2016]序列 CDQ分治+动态规划
你发现只会改变一个位置,所以可以直接进行dp 具体转移的话用 CDQ 分治转移就好了~ #include <bits/stdc++.h> #define N 100006 #define ...
- 关于Windows系统里的事后调试
我一直在想,应用程序抛出未处理的异常和附加到进程的调试器之间会发生什么.显然这些信息就在我眼皮底下,但我是瞎子.Windows调试器关于事后调试的文档包含了您想要知道的所有详细信息. 最常见的应用程序 ...
- IDEA的foreach循环
试了试其他快捷键, 突然发现的... 先弄一个list 再把变量名写出来先 按快捷键 ctrl+alt+J, 选最后一个 看效果
- React_02_ECMAScript6
1.let与const ES2015(ES6) 新增加了两个重要的 JavaScript 关键字: let 和 const. let 声明的变量只在 let 命令所在的代码块内有效,const 声明一 ...
- windows批量删除当前目录以及子目录的所有空文件夹
在桌面创建一个记事本,将以下内容复制粘贴到记事本中,将记事本的拓展名修改为bat即可,然后将该文件放到需要执行的目录双击. @echo off setlocal enabledelayedexpans ...
- 14、Docker监控方案(Prometheus+cAdvisor+Grafana)
上一篇文章我们已经学习了比较流行的cAdvisor+InfluxDB+Grafana组合进行Docker监控.这节课来学习Prometheus+cAdvisor+Grafana组合. cAdvisor ...
- 微信小程序之页面导航栏
效果图: 页面有点丑,作为初次学习,页面可以要求不那么美观,先学会再说.毕竟后面可以优化的很漂亮. 代码实例如下: <view class="section btn-area" ...
- Xamarin图表开发基础教程(4)OxyPlot框架
Xamarin图表开发基础教程(4)OxyPlot框架 XamaminAndroid中绘制线图OxyPlotAndroidDemo [示例1-1:OxyPlotAndroidDemo]下面实现线图的绘 ...