博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java码农必须掌握的循环删除List元素的正确方法!
阅读量:5942 次
发布时间:2019-06-19

本文共 1248 字,大约阅读时间需要 4 分钟。

首先看下下面的各种删除list元素的例子

public static void main(String[] args) {

List list = new ArrayList<>(Arrays.asList("a1", "ab2", "a3", "ab4", "a5", "ab6", "a7", "ab8", "a9"));

/**

*报错

*java.util.ConcurrentModificationException

*/

for (String str : list) {

if (str.contains("b")) {

list.remove(str);

}

}

/**

*报错:下标越界

*java.lang.IndexOutOfBoundsException

*/

int size = list.size();

for (int i = 0; i < size; i++) {

String str = list.get(i);

if (str.contains("b")) {

list.remove(i);

}

}

/**

*正常删除,每次调用size方法,损耗性能,不推荐

*/

for (int i = 0; i < list.size(); i++) {

String str = list.get(i);

if (str.contains("b")) {

list.remove(i);

}

}

/**

*正常删除,推荐使用

*/

for (Iterator ite = list.iterator(); ite.hasNext();) {

String str = ite.next();

if (str.contains("b")) {

ite.remove();

}

}

/**

*报错

*java.util.ConcurrentModificationException

*/

for (Iterator ite = list.iterator(); ite.hasNext();) {

String str = ite.next();

if (str.contains("b")) {

list.remove(str);

}

}

}

报异常IndexOutOfBoundsException我们很理解,是动态删除了元素导致数组下标越界了。

那ConcurrentModificationException呢?

其中,for(xx in xx)是增强的for循环,即迭代器Iterator的加强实现,其内部是调用的Iterator的方法,为什么会报ConcurrentModificationException错误,我们来看下源码

取下个元素的时候都会去判断要修改的数量和期待修改的数量是否一致,不一致则会报错,而通过迭代器本身调用remove方法则不会有这个问题,因为它删除的时候会把这两个数量同步。搞清楚它是增加的for循环就不难理解其中的奥秘了。

转载地址:http://fnzxx.baihongyu.com/

你可能感兴趣的文章
【java】File的使用:将字符串写出到本地文件,大小0kb的原因
查看>>
安卓音乐播放器开发实例
查看>>
Junit指定测试执行顺序
查看>>
PHP put提交和获取数据
查看>>
s3接口认证说明
查看>>
js /jquery停止事件冒泡和阻止浏览器默认事件
查看>>
线程的一些解释
查看>>
Fiddler (三) Composer创建和发送HTTP Request
查看>>
C语言 多维数组和指针
查看>>
DotNetBar的使用—(界面风格)
查看>>
2.3系列系统中不支持SimpleDateFormat作字段被序列化
查看>>
DJANGO MODEL FORMSETS IN DETAIL AND THEIR ADVANCED USAGE
查看>>
ADO.NET复习——自己编写SqlHelper类
查看>>
库函数strlen源码重现及注意问题
查看>>
《实例化需求》读书笔记
查看>>
常用Java8语法小结
查看>>
ZJOI2019 Day2 游记
查看>>
ccf题库中2015年12月2号消除类游戏
查看>>
WinForm窗体间如何传值
查看>>
Ado.Net 连接数据库
查看>>