这几天在项目中遇到了小问题,在使用集合迭代器进行遍历的时候,操作了正在遍历的集合,完事一直报错,起初我就没有想到是快速失败,但是看了源码之后,才想明白。代码如下:
JSONObject maps = JSON.parseObject(info.getUserId());
List<String> ids = new ArrayList<>();
maps.entrySet().forEach((item -> {
JSONObject jsonObject = JSON.parseObject(item.getValue().toString());
jsonObject.forEach((key, value) -> {
if (value instanceof Collection) {
JSONArray jsonArray = JSON.parseArray(value.toString());
jsonArray.forEach(item1->{
ids.add((String) item1);
});
}
processInfoApi.findUser(value.toString());
if(key.equals("groupId")){
List<String> list = processInfoApi.groupSelectById(value.toString());
list.forEach(item2->{
if(info.getUserId().contains(item2)){
processInfoApi.deleteMem(item2, value.toString());
}
});
}
});
String groupId = processInfoApi.saveGroup(ids);
ids.clear();
jsonObject1.put("groupId",groupId);
maps.remove(item.toString());
});
我还一直以为是代码问题,但是研究源码了之后,出现了快速失败和安全失败两个集合遍历操作类型的异常;
快速失败指的是:在使用迭代器对集合进行遍历时,如果对当前地址集合中的数据进行操作时,会直接失败,这是对数据完整性的保护,直接抛出异常,不让程序接着运行。
安全失败指的是:在使用 for i 循环遍历时,可以去操作添加数据,因为这样遍历集合有下标的概念,但是如果在遍历时,删除集合中的某一个元素,那么这个 for i 循环会直接报数组下标越界,这种情况属于安全失败。
以上为我自己的理解,如有不对,敬请指出。
互相学习,共同进步