Java-Object类equals方法详解
1 equals
以前的定式思维:
==: ++返回的结果是boolean类型 基本数据类型:比较的是两边的值是否相同
引用数据类型:比较的是两边的地址值是否相同++
public boolean equals(Object obj)指示一些其他对象是否等于此。
通过观察发现,我们使用equals方法后,比较的结果和我们想的不太一样,我们要想知道这个方法是如何实现就应该去看源码,按住ctrl键+鼠标左键。
- 观察源码发现:
public boolean equals(Object obj) {
return (this == obj);
}
结论:
Object中equals方法底层默认调用的技术依旧是,而比较引用数据类型,比较的是地址值,而是s1和s2是两个不同的对象,所以地址值不是一样的,所以equals比较的结果是false。
解决办法:
更多的情况下,我们比较引用数据类型对象的时候,想要比较的是他们成员变量之间的值是否一样,而不是比较地址值。所以,在想要比较成员变量值是否一样的情况下,子类重写equals方法,也不需要自己手动给出,自动生成即可。
上代码:
package com.bigdat.java.day16;
import java.util.Objects;
class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
//在这里对 equals 方法进行了重写才使得 比较的只是两个对象所对应的地址值。才使得s1.equal(s2) 的值为true
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
/**
public boolean equals(Object obj)指示一些其他的值是否等于此
通过观察发现,我们使用equals后,比较的结果和我们想的不太一样
我们通过查看码源后发现:
public boolean equals(Object obj) {
return (this == obj);
}
Object中equals方法底层默认调用的技术依旧是 ==, 而用== 比较引用的数据类型,
比较的是地址值;s1和s2是两个不同的对象所以还是false
更多的情况下,我们比较引用数据类型对象的时候,想要比较的是他们成员变量之间的值是否一样,
而不是比较地址值。所以,在想要比较成员变量值是否一样的情况下,子类重写equals方法,也不需要自己手动给出,自动生成即可。
==: 返回的结果是boolean类型
基本数据类型:比较的是两边的值是否相同
引用数据类型:比较的是两边的地址值是否相同
*/
public class ObjectDemo1 {
public static void main(String[] args) {
Student s1 = new Student("二狗子",10);
Student s2 = new Student("二狗子",10);
System.out.println(s1.toString());
Student s3 =s1;
System.out.println(s1 == s2); //false "==" 比较的是地址值
System.out.println(s1 == s3); //true 将s1的地址值赋值给s3.地址值一样
System.out.println("=======================================");
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义