如何编写Book类的equals方法以实现双属性相等判断
完善Book类的equals方法,实现title和bound相等则对象相等
你当前的equals方法逻辑完全不符合需求——只要传入的是Book实例就直接返回true,完全没校验title和bound这两个核心属性。下面是符合要求的实现,同时附带Java规范要求的hashCode重写(因为规范明确:如果两个对象equals返回true,它们的hashCode必须相等,否则在HashMap、HashSet这类集合中会出现异常行为)。
完整代码实现
import java.util.Objects; public class Book { private String title; private boolean bound; Book(String title, boolean bound) { this.title = title; this.bound = bound; } @Override public boolean equals(Object obj) { // 同一对象直接返回true,提升效率 if (this == obj) return true; // 参数为null或不是Book类型,直接返回false if (obj == null || getClass() != obj.getClass()) return false; // 强转为Book类型 Book book = (Book) obj; // 比较bound属性,用Objects.equals处理title的null情况 return bound == book.bound && Objects.equals(title, book.title); } @Override public int hashCode() { // 根据参与equals比较的属性生成哈希值 return Objects.hash(title, bound); } }
关键细节说明
- 同一对象判断:
this == obj是为了避免不必要的属性比较,提升方法执行效率。 - 类型判断:用
getClass() != obj.getClass()代替instanceof,是为了避免子类和父类之间的误判(如果后续Book有子类,instanceof会导致子类实例和父类实例被错误判定为相等;如果确定不会有子类,用instanceof也可以,但getClass的方式更严谨)。 - 属性比较:
bound是boolean类型,直接用==比较即可。title是String类型,Objects.equals可以同时处理title为null的情况,避免空指针异常(等价于手动写(title == null ? book.title == null : title.equals(book.title)))。
- hashCode重写:用
Objects.hash根据title和bound生成哈希值,保证equals相等的对象hashCode一定相等。
内容的提问来源于stack exchange,提问作者LoveFile
相关产品推荐
相关产品推荐

