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
相关产品推荐
相关产品推荐

