如何根据传入的ID参数删除Java ArrayList中的对应Book元素
错误原因
- 遍历集合时违规修改:你当前使用的增强for循环底层基于迭代器实现,遍历过程中直接调用
ArrayList.remove()修改集合结构,不会同步告知迭代器,会触发ConcurrentModificationException,还会出现遍历遗漏、误删等异常表现。 - 字符串比较逻辑错误:
id是String引用类型,使用==比较的是两个对象的内存地址,而非字符串内容,只有两个字符串是同一个对象时才会匹配成功,绝大多数相同内容的字符串会匹配失败,如果判断条件写反还会出现全删列表的问题。
正确实现方案
方案1:Iterator迭代器实现(兼容所有Java版本)
你之前尝试迭代器失败大概率是写法错误,正确的迭代器删除写法如下,直接替换你的removeBook方法即可:
// Remove book from library public void removeBook(String id) { Iterator<Book> iterator = books.iterator(); while (iterator.hasNext()) { Book book = iterator.next(); // 用equals比较字符串内容,前置id判断避免空指针 if (id.equals(book.getId())) { // 用迭代器的remove方法,不会触发并发修改异常 iterator.remove(); // 如果id是唯一的,匹配到删除后可以直接break退出循环,提升性能 break; } } }
方案2:removeIf简化实现(Java 8及以上版本推荐)
Java 8为集合新增了removeIf方法,底层已经处理了遍历和删除的逻辑,一行代码即可完成需求:
// Remove book from library public void removeBook(String id) { books.removeIf(book -> id.equals(book.getId())); }
验证说明
修改后删除逻辑会直接移除匹配id的整个Book对象,不会仅删除id字段,也不会误删其他书籍,只需要保证你的Book类中getId()方法能正确返回书籍的id属性即可。
内容的提问来源于stack exchange,提问作者Yound Puddle Duck
相关产品推荐
相关产品推荐

