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

如何正确实现和使用入参为Book类型的removeBook(Book)方法

解决方案

第一步:为Book类重写equals()和hashCode()方法

Java默认的equals()方法比较的是两个对象的内存地址,如果你希望根据书籍的业务属性(比如书名、ISBN号等)判断两本书是否是同一本,需要在Book类中重写这两个方法,示例如下:

import java.util.Objects;

public class Book {
    private String title;
    private String isbn;
    // 其他属性、getter、setter、构造方法省略

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        // 这里可以自定义匹配规则,比如只匹配书名就只写Objects.equals(title, book.title)
        return Objects.equals(title, book.title) && Objects.equals(isbn, book.isbn);
    }

    @Override
    public int hashCode() {
        return Objects.hash(title, isbn);
    }
}

第二步:修改removeBook方法

你原来的代码里不需要额外定义id变量,直接用遍历得到的Book对象和入参比较即可,同时要修正“未找到书籍”提示的打印逻辑,避免循环中每遍历一个不匹配的对象就打印一次:

public void removeBook(Book targetBook) {
    Iterator<Book> it = books.iterator();
    boolean isFound = false;
    while(it.hasNext()) {
        Book current = it.next();
        if(current.equals(targetBook)) {
            it.remove();
            isFound = true;
            // 如果要求只删除第一个匹配的书籍,这里可以加break;
        }
    }
    if(!isFound) {
        System.out.println("Book not found");
    }
}

补充说明

  • 如果你不需要自定义匹配规则,能够保证传入removeBook的Book对象就是ArrayList中存储的同一个对象,也可以不重写equals(),直接用==比较:if(current == targetBook),但这种方式适用场景非常有限,更推荐重写equals()的方案。
  • 如果业务要求删除所有匹配的书籍,不需要在删除后加break,如果只需要删除第一个匹配的,删除后加break跳出循环即可提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:36:03