对集合中元素的删除为什么要使用迭代器
各种处理方式分析
1.在增强for循环中使用remove删除
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for (String s : list) {
if (s.equals("5")) {
list.remove(s);
}
}
System.out.println(list);
}
这里会报一个并发修改异常
那么这个异常是什么导致的呢。首先我们要明白一点,增强for循环,在编译过后遍历是通过迭代器来实现,也正是这个实现方式,导致出现了问题。
2.普通for循环删除
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("f");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("d")) {
list.remove(i);
}
}
for (int j = 0; j < list.size(); j++) {
System.out.println(list.get(j));
}
}
可以看到此时并没有报错,但是我们发现最终的list里并没有将所有的"d"删除,并不是我们想要的结果,即这种方式删除的时候,不会报错,但是当遇到连续要删除的值的时候,就会漏删。因为当你删除的时候,后面一个索引就往前移了一个,但是i的值还在增加,所以导致漏删的情况。
3.正确方式:使用迭代器进行删除
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("f");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals("d")) {
iterator.remove();
}
}
for (int j = 0; j < list.size(); j++) {
System.out.println(list.get(j));
}
}
结果符合我们的预期哈
4.jdk1.8后的快捷方式
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("d");
list.add("d");
list.add("d");
list.add("d");
list.add("f");
List<String> collect = list.stream().filter(new Predicate<String>() {
@Override
public boolean test(String s) {
return !s.equals("d");
}
}).collect(Collectors.toList());
for (int j = 0; j < collect.size(); j++) {
System.out.println(collect.get(j));
}
}
可以看到转化为流之后使用filter方式很轻松的就达到了我们想要的结果。
艾欧尼亚,昂扬不灭,为了更美好的明天而战(#^.^#)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构