《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
list.add(“F”);
list.add(“C”);
list.add(“C”);
[C, A, B, C, F, C, C]
怎么移除掉list里面的某个元素呢 ?
list里面给我们提供了4个方法 :
先看 remove ( Object o) :
这个方面字面意思看,就是,你想移除list里面的哪个 Object ,你传进来就可以。
看源码,如下图:
也就是说并不是想移除哪个传哪个就能移除完, 而仅仅是只移除首个符合规则的元素。
结合例子:
现在这个List里面,存在4 个 “C” 元素 , 使用remove(“C”):
List list = new ArrayList();
list.add(“C”);
list.add(“A”);
list.add(“C”);
list.add(“B”);
list.add(“F”);
list.add(“C”);
list.add(“C”);
System.out.println(“未移除前”+list.toString());
list.remove(“C”);
System.out.println(“移除后”+list.toString());
结果:
未移除前[C, A, C, B, F, C, C]
移除后[A, C, B, F, C, C]
所以,光这样使用remove是不行的,不能实现我们需求 : 移除 list中的所有符合条件的元素,仅仅移除了符合条件的第一个 元素了。
这时候,大家可能就会想,那么我们就循环+remove呗,这样就能把每个符合条件的移除了。
真的吗?
接着看。
循环 + remove ( Object o)/ remove(Index i):
没错,我们可以配合循环,把list里面的“C”元素都移除。
循环自然有分 while循环和 for循环(包含foreach) 。
先看 foreach方式 :
不得行! 切记!
for (String str: list){
if (“C”.equals(str)){
list.remove(str);
}
}
代码看似没问题,但是在foreach 使用 list的 remove / add 方法都是不行的!
报错:
ConcurrentModificationException : 并发异常
PS: 其实如果大家曾阅读过阿里的开发规范,也许会有一点印象。
7.【强制】不要在foreach循环里进行元素的remove/add 操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。
那么先不管,如果你阅读过,可能也不一定知道里面的原理,所以继续往下看吧。
在分析这个错误前,我来提一嘴 ,一部分的ArrayList的特性:
ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。
ArrayList不是线程安全的。
支持快速随机访问,通过下标序号index进行快速访问。
接下来,跟着我,一起来分析这个报错的出现 (当然我的挖错方式不一定适合大家,但是也可以参考):
1. 分析出错的代码段
for (String str: list){
if (“C”.equals(str)){
list.remove(str);
}
}
光这样看,我们只能知道,用了foreach的语法糖,那么我们看编译后的:
再看我们的报错信