请选择 进入手机版 | 继续访问电脑版
搜索
房产
装修
汽车
婚嫁
健康
理财
旅游
美食
跳蚤
二手房
租房
招聘
二手车
教育
茶座
我要买房
买东西
装修家居
交友
职场
生活
网购
亲子
情感
龙城车友
找美食
谈婚论嫁
美女
兴趣
八卦
宠物
手机

为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remov

[复制链接]
查看: 73|回复: 0

1万

主题

2万

帖子

4万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
48032
发表于 2019-12-3 07:57 | 显示全部楼层 |阅读模式
在阅读《阿里巴巴Java开辟手册》时,发现有一条关于在 foreach 循环里举行元素的 remove/add 操纵的规约,具体内容以下:
为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remov  游戏 20191202223028397

毛病演示

我们首先在 IDEA 中编写一个在 foreach 循环里举行 remove 操纵的代码:
  1. import java.util.ArrayList;import java.util.List;public class ForEachTest {    public static void main(String[] args) {        List list = new ArrayList();        list.add("wupx");        list.add("love");        list.add("huxy");        for (String temp : list) {            if ("love".equals(temp)) {                list.remove(temp);            }        }        System.out.println(list);    }}
复制代码
此时实行代码,编译切确,实行乐成!输出 [wupx, huxy]。
接着我们把 “love” 换成 “wupx” 或是 “huxy” 再来运转下,实行成果以下:
为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remov  游戏 20191202224321610

纳尼,居然报错了,为什么第一次运转没有报错呢?让我们一路来举行探讨吧!
追根溯源

为了研讨为什么会出现这样的情况,我们可以按照很是仓库信息,去追踪毛病,其中触及到的部分源码以下:
[code]private class Itr implements Iterator {    int cursor;       // 下一个要返回的元素的索引    int lastRet = -1; // 返回的末端一个元素的索引(假如没有返回-1)    int expectedModCount = modCount;    public boolean hasNext() {        return cursor != size;    }        public void remove() {        if (lastRet < 0)            throw new IllegalStateException();        checkForComodification();        try {            ArrayList.this.remove(lastRet);            cursor = lastRet;            lastRet = -1;            expectedModCount = modCount;        } catch (IndexOutOfBoundsException ex) {            throw new ConcurrentModificationException();        }    }    @Override    @SuppressWarnings("unchecked")    public void forEachRemaining(Consumer

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2006-2014 妈妈网-中国妈妈第一,是怀孕、育儿、健康等知识交流传播首选平台 版权所有 法律顾问:高律师 客服电话:0791-88289918
技术支持:迪恩网络科技公司  Powered by Discuz! X3.2
快速回复 返回顶部 返回列表