You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何遍历Person列表删除所有匹配指定firstName的元素?

问题根因
  • 初始版本逻辑问题:遍历全程只记录最后一个匹配的Person对象,循环结束后仅执行一次删除,自然只能删一个。
  • 增强for循环中直接调用List.remove()的问题:增强for是迭代器的语法糖,遍历过程中直接修改集合结构(增删)会触发ConcurrentModificationException,即便未抛出异常,删除元素后列表索引会整体前移,会直接跳过下一个待遍历的元素,导致漏删匹配项。
  • 最后写的嵌套循环存在逻辑错误,甚至可能触发死循环,完全不可用。
正确实现方案

以下三种是常用的安全实现方式:

方案1:使用迭代器自带的remove方法(兼容所有Java版本)

这是最稳妥的通用实现,迭代器的remove()方法会同步修改expectedModCount,不会触发并发修改异常,能正确遍历所有元素。

public void deleteFriend(String firstName){
    Iterator<Person> iterator = friendsList.iterator();
    while (iterator.hasNext()) {
        Person f = iterator.next();
        if(f.getFirstName().equalsIgnoreCase(firstName)){
            iterator.remove();
        }
    }
    System.out.println("All matched friends deleted.");
}

方案2:Java 8+ 直接使用removeIf方法(最简写法)

Java 8及以上版本的Collection接口提供了removeIf()默认方法,底层就是迭代器实现,一行代码就能完成需求:

public void deleteFriend(String firstName){
    friendsList.removeIf(f -> f.getFirstName().equalsIgnoreCase(firstName));
    System.out.println("All matched friends deleted.");
}

方案3:倒序遍历普通for循环

倒序遍历的时候,删除元素只会影响已经遍历过的后半段索引,不会干扰未遍历的前半段,不会出现漏删的问题:

public void deleteFriend(String firstName){
    for (int i = friendsList.size() - 1; i >= 0; i--) {
        if (friendsList.get(i).getFirstName().equalsIgnoreCase(firstName)) {
            friendsList.remove(i);
        }
    }
    System.out.println("All matched friends deleted.");
}

内容的提问来源于stack exchange,提问作者cruella devil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:03