//通过下表移除等于11的元素
for (int i = 0; i < list.size(); i++) {
String item = list.get(i);
if ("1".equals(item)) {
list.remove(i);
}
}
System.out.println("通过下表移除后的list元素:" + list.toString());
//通过对象移除等于11的元素
for (int i = 0; i < copyList.size(); i++) {
String item = copyList.get(i);
if ("1".equals(item)) {
copyList.remove(item);
}
}
System.out.println("通过对象移除后的list元素:" + list.toString());
}
运行结果:
debug发现,移除元素后,集合大小也减一,但i却+1了,会导致直接跳过原本第二个元素,操作第三个元素,如果被跳过的那个元素恰好满足移除条件,就会出现下面的情况,两个同时满足条件的元素会被漏掉第二个。
缺点:相邻的满足条件删除不完全
二、加强for
private static void test2() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("1");
list.add("4");
list.add("5");
list.add("5");
list.add("6");
System.out.println("原始list元素:"+ list.toString());
//通过对象移除等于11的元素
for (String item : list) {
if("1".equals(item)) {
list.remove(item);
}
}
System.out.println("通过对象移除后的list元素:"+ list.toString());
}
运行代码循环第二次时报错,
由于foreach是由迭代器实现的
查找实现类
追踪实现方法
打两个打断点,判断移除第一个元素之前,
会执行checkForComodification()方法ArrayList.this.size次
移除第二个元素时会报错,此处校验值已经改变了
由于forEachRemaining的checkForComodification方法在remove之前执行,在 foreach 循环中执行 list.remove(item),对 list 对象的 modCount 值进行了修改,而 list 对象的迭代器的 expectedModCount 值未进行修改,所以导致ConcurrentModificationException异常
三、Iterator
private static void test5() {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("1");
list.add("2");
list.add("3");
list.add("1");
list.add("5");
list.add("1");
list.add("6");
System.out.println("原始list元素:"+ list.toString());
最后
我想问下大家当初选择做程序员的初衷是什么?有思考过这个问题吗?高薪?热爱?
既然入了这行就应该知道,这个行业是靠本事吃饭的,你想要拿高薪没有问题,请好好磨练自己的技术,不要抱怨。有的人通过培训可以让自己成长,有些人可以通过自律强大的自学能力成长,如果你两者都不占,还怎么拿高薪?
架构师是很多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
多程序员的职业目标,一个好的架构师是不愁所谓的35岁高龄门槛的,到了那个时候,照样大把的企业挖他。为什么很多人想进阿里巴巴,无非不是福利待遇好以及优质的人脉资源,这对个人职业发展是有非常大帮助的。
如果你也想成为一名好的架构师,那或许这份Java核心架构笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。
中高级开发必知必会:
[外链图片转存中…(img-e2GQM4c2-1714501802531)]