Java码农必须掌握的循环删除List元素的正确方法!

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

public static void main(String[] args) {

List<String> 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<String> ite = list.iterator(); ite.hasNext();) {

String str = ite.next();

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

ite.remove();

}

}

/**

* 报错

* java.util.ConcurrentModificationException

*/

for (Iterator<String> 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循环就不难理解其中的奥秘了。

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2017-06-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

Java HashMap 遍历方式性能探讨

关于HashMap的实现这里就不展开了,具体可以参考 JDK7与JDK8中HashMap的实现 JDK8之前,可以使用keySet或者entrySet来遍历Ha...

451120
来自专栏恰童鞋骚年

剑指Offer面试题:12.在O(1)时间删除链表结点

  在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。这种思路由于需要顺序查找,时间复杂度自然就是...

8110
来自专栏尾尾部落

[LeetCode]Degree of an Array 数组的度 [LeetCode]Degree of an Array 数组的度

链接:https://leetcode.com/problems/degree-of-an-array/description/ 难度:Easy 题目:69...

12420
来自专栏闵开慧

HashMap与HashTable区别

1 HashMap不是线程安全的 hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复...

27960
来自专栏用户画像

HashSet和HashMap的区别 && HashTable和HashMap的区别

2.Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。

10130
来自专栏Java帮帮-微信公众号-技术文章全总结

【Java提高十六】集合List接口详解

在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影!java中集合大家族的成员实在...

26030
来自专栏小二的折腾日记

LeetCode-49-Group-Anagrams

输入一个字符串数组,输出的是:将相同字符的字符串放在一个数组的二维数组。相同字符的处理,基本就是要对字符串排序的。然后需要考虑的就是排序好的那一个字符串怎么存的...

8010
来自专栏小勇DW3

ArrayList在foreach删除倒数第二个元素不抛并发修改异常的问题

平时我们使用ArrayList比较多,但是我们是否知道ArrayList在进行foreach的时候不能直接通过list的add或者move方法进行删除呢,

22730
来自专栏移动端开发

Java集合类总结

前言: 这篇准备好好总结一下Java的集合类,在顺便带上Arrays,把这几者之间的关系说清楚,在java.util包中提供了一些集合类,这些集合类又被称作容...

31690
来自专栏Android机动车

数据结构学习笔记——线性表(下)

了解过线性表的链式存储结构以后,有人就想出来用数组来代替指针,来描述单链表。看看他们是怎么做到的。

5110

扫码关注云+社区

领取腾讯云代金券