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

LinkedList遍历操作时始终执行else分支的技术问题咨询

问题分析与解决方案

首先,你的代码存在两个关键问题导致无法正常删除客户:

1. 集合初始化逻辑错误

你在customerRemove()方法里每次调用都会重新创建一个新的LinkedList<Customer>并添加固定的三个客户:

customers = new LinkedList <Customer>();
customers.add(new Customer(1, "John", 20));
customers.add(new Customer(2, "Mike", 21));
customers.add(new Customer(3, "Harry", 22));

如果customers是类的成员变量,这意味着每次执行删除操作时,你都在操作一个全新的列表,之前的任何修改都会被覆盖。就算用户输入的是1/2/3这类存在的ID,也会因为列表被重新初始化,导致之前的操作痕迹完全消失,看起来像是匹配不到元素。

2. 增强for循环遍历删除元素引发的并发修改异常

使用增强for循环(for-each)遍历集合时,底层会依赖迭代器Iterator来遍历元素。此时直接调用customers.remove(rmvCustomer)会修改集合的结构,触发ConcurrentModificationException——这个异常会导致循环提前终止,程序中断执行,你可能误以为是没有匹配到元素,实际是异常打断了流程。


修复后的解决方案

方案一:使用迭代器安全删除(推荐)

这是集合遍历并修改的标准安全方式,能避免并发修改异常:

private void customerRemove() {
    // 注意:如果customers是成员变量,不要每次都重新初始化!
    // 初始化逻辑应该放在构造方法或者类初始化块中,比如:
    // if (customers == null) {
    //     customers = new LinkedList<Customer>();
    //     customers.add(new Customer(1, "John", 20));
    //     customers.add(new Customer(2, "Mike", 21));
    //     customers.add(new Customer(3, "Harry", 22));
    // }

    System.out.println("\nRemoving a customer.");
    System.out.print("Enter a customer ID: ");
    int rmvId = In.nextInt();

    Iterator<Customer> iterator = customers.iterator();
    boolean removed = false;
    while (iterator.hasNext()) {
        Customer rmvCustomer = iterator.next();
        if (rmvCustomer.getID() == rmvId) {
            iterator.remove(); // 使用迭代器的remove方法,不会触发并发修改异常
            System.out.println("Customer removed.");
            removed = true;
            break; // 找到并删除后可以终止循环,提升效率
        }
    }
    if (!removed) {
        System.out.println("Customer with ID " + rmvId + " not found.");
    }
}

方案二:使用普通for循环(从后往前遍历)

如果不想用迭代器,可以用普通for循环从列表末尾开始遍历,避免删除元素后索引错乱:

private void customerRemove() {
    // 同样,不要每次重新初始化customers
    System.out.println("\nRemoving a customer.");
    System.out.print("Enter a customer ID: ");
    int rmvId = In.nextInt();

    boolean removed = false;
    for (int i = customers.size() - 1; i >= 0; i--) {
        Customer rmvCustomer = customers.get(i);
        if (rmvCustomer.getID() == rmvId) {
            customers.remove(i);
            System.out.println("Customer removed.");
            removed = true;
            break;
        }
    }
    if (!removed) {
        System.out.println("Customer with ID " + rmvId + " not found.");
    }
}

方案三:Java 8+ 简洁方式(removeIf)

如果你的项目使用Java 8及以上版本,可以用removeIf()方法一行完成删除逻辑,代码更简洁:

private void customerRemove() {
    // 同样,不要每次重新初始化customers
    System.out.println("\nRemoving a customer.");
    System.out.print("Enter a customer ID: ");
    int rmvId = In.nextInt();

    boolean removed = customers.removeIf(customer -> customer.getID() == rmvId);
    if (removed) {
        System.out.println("Customer removed.");
    } else {
        System.out.println("Customer with ID " + rmvId + " not found.");
    }
}

关键注意点

  • 不要在每次调用方法时重新初始化customers列表:如果这是类的成员变量,应该只在类初始化或构造方法中创建并添加初始数据,否则每次操作都是在全新的列表上进行,之前的修改都会丢失。
  • 永远不要在增强for循环中直接修改集合结构:删除、添加元素都应该通过迭代器或者其他安全方式进行,避免触发并发修改异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:39:38