重写的对象比较方法equals

本文深入探讨了在Java中重写equals方法的细节,解释了如何通过比较对象的特定属性来判断两个对象是否相等,而不是简单地比较它们的引用。通过具体的代码示例,阐述了equals方法的工作原理和正确实现的重要性。

重写的对象比较方法equals


例:

public boolean equals(Object obj)
     return this.name.equals(p.name)&&this.age==p.age;
        }

this表示本对象,比如你这样调用equals函数:stu1.equals(stu2),this就表示stu1。
this == obj是直接使用 == 进行比较 == 的判断标准是只有2个对象都是引用的相同对象才相等。
而如果二者是不同的对象,equals还想通过比较两个对象的name和age的方式判断是否是相等的,如果两个对象是相同的类型并且name和age相等,也认为两个对象相等。
这段代码就是这个作用的。

也可以这么理解:

stu.name.equals(this.name)
//句等同于
String name = stu.name;
name.equals(this.name)
//对象stu的属性name所属的类型(应该为String)有equals方法
Java 中,重写对象的 `equals` 方法有一定的规则和步骤,以下是详细介绍: ### 为什么要重写 `equals` 方法 如果不重写 `equals` 方法,执行 `user1.equals(user2)` 比较的就是两个对象的地址(即 `user1 == user2`),通常这不是我们想要的比较逻辑。例如,我们可能希望比较两个对象的属性是否相等,而不是比较它们是否为同一个对象引用。见 `Object` 源码: ```java public boolean equals(Object obj) { return (this == obj); } ``` 当我们需要自定义对象的相等判断逻辑时,就需要重写 `equals` 方法[^3]。 ### 重写 `equals` 方法的示例 以下是几种重写 `equals` 方法的示例: #### 示例一:比较 `name` 和 `age` 属性 ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person p = (Person) obj; return this.name.equals(p.name) && this.age == p.age; } } ``` 在这个示例中,首先使用 `this == obj` 检查是否为同一个对象引用,如果是则直接返回 `true`。然后检查 `obj` 是否为 `null` 或者是否为不同的类,如果是则返回 `false`。最后,将 `obj` 强制转换为 `Person` 类型,并比较 `name` 和 `age` 属性是否相等[^2]。 #### 示例二:比较 `id`、`name` 和 `sex` 属性 ```java public class Student { private int id; private String name; private char sex; public Student(int id, String name, char sex) { this.id = id; this.name = name; this.sex = sex; } public int getId() { return id; } public String getName() { return name; } public char getSex() { return sex; } @Override public boolean equals(Object obj) { if (obj instanceof Student) { Student s = (Student) obj; if (this.id == s.getId() && this.name.equals(s.getName()) && this.sex == s.getSex()) { return true; } } return false; } } ``` 在这个示例中,使用 `instanceof` 判断 `obj` 是否为 `Student` 类型,如果是则将其强制转换为 `Student` 类型,并比较 `id`、`name` 和 `sex` 属性是否相等。如果所有属性都相等,则返回 `true`,否则返回 `false`[^5]。 ### 重写 `equals` 方法的注意事项 - **覆盖 `hashCode` 方法**:覆盖 `equals` 时总要覆盖 `hashCode`,以确保相等的对象具有相同的哈希码。 - **不要让 `equals` 方法过于复杂**:不要试图让 `equals` 方法过于智能,保持逻辑简单明了。 - **不要替换 `equals` 声明中的 `Object` 类型**:不要将 `equals` 声明中 `Object` 对象替换为其他对象[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值