Java码农必须掌握的循环删除List元素的正确方法!
来源:互联网 发布:京东和淘宝哪个售后好 编辑:程序博客网 时间:2024/05/29 14:04
首先看下下面的各种删除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循环就不难理解其中的奥秘了。
- Java码农必须掌握的循环删除List元素的正确方法!
- Java编程:删除 List 元素的三种正确方法
- Java编程:删除 List 元素的三种正确方法
- Java编程:删除 List 元素的三种正确方法
- Java编程:删除 List 元素的三种正确方法
- Java中删除 List 元素的三种正确方法
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- JAVA中循环删除list中元素的方法总结
- 循环删除list中元素的方法
- C++ set map list的正确删除元素方法
- 遍历List集合同时删除元素的正确方法
- C++11:lambda表达式
- volatile关键字解析~高级java必问
- I
- 高级java必须清楚的概念:原子性、可见性、有序性
- 厉害了,Servlet3的异步处理机制
- Java码农必须掌握的循环删除List元素的正确方法!
- 作为架构师,你必需要搞清楚的概念:POJO、PO、DTO、DAO、BO、VO
- 设计模式之静态代理模式实战
- HDU 6134 Battlestation Operational
- 实现java多线程的3种方式,99%人没用过第3种
- 架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312...
- Spring bean
- leakcanary使用
- 面试必问-几种线程安全的Map解析