|NO.Z.00004|——————————|BigDataEnd|——|Java&核心类库.V04|——|Java.v04|equals方法|重写实现|equals方法和hashCode方法生成|
一、[equals方法的重写实现]equals方法的重写equals方法和hashCode方法的生成]:equals方法的重写实现
package com.yanqi.task11;
import java.util.Objects;
public class Student extends Object {
private int id; // 用于描述学号的成员变量
private String name; // 用于描述姓名的成员变量
public Student() {
}
public Student(int id, String name) {
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if (id > 0) {
this.id = id;
} else {
System.out.println("学号不合理哦!!!");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return id == student.id &&
Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
/*
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
if (id != student.id) return false;
return name != null ? name.equals(student.name) : student.name == null;
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + (name != null ? name.hashCode() : 0);
return result;
}
*/
/**
* 为了比较两个对象的内容,也就是学号信息需要重写该方法
*/
// Student this = s1;
// Object obj = s2;
/*
@Override
public boolean equals(Object obj) {
// 当调用对象和参数对象指向同一个对象时,则内容一定相同
if (this == obj) return true;
// 当调用对象为不为空而参数对象为空时,则内容一定不相同
if (null == obj) return false;
// 判断obj指向的对象是否为Student类型的对象,若是则条件成立,否则条件不成立
if (obj instanceof Student) {
Student ts = (Student) obj;
// 以学号作为基准判断两个对象是否相等 int是基本数据类型,内存空间中放的就是数据本身,使用 == 可以判断数据是否相同
//return this.getId() == ts.getId();
// 以姓名作为基准判断两个对象是否相等 String是引用数据类型,内存空间中放的是地址,使用 == 判断地址是否相同
// 也就是判断两个对象中姓名字符串的地址是否相同,不够完美
//return this.getName() == ts.getName();
return this.getName().equals(ts.getName()); // 比较姓名字符串的内容是否相同
}
// 否则类型不一致没有可比性,则内容一定不相同
return false;
}
*/
/**
* 为了使得该方法的结果与equals方法的结果保持一致,从而满足Java官方的常规协定,需要重写该方法
*/
/*
@Override
public int hashCode() {
//return getId(); // 不再代表内存地址的编号了
final int type = 12;
//return type*31 + getId();
return type*31 + getName().hashCode();
}
*/
/**
* 为了返回更有意义的字符串数据,则需要重写该方法
*/
/*
@Override
public String toString() {
return "Student[id = " + getId() + ", name = " + getName() + "]";
}
*/
}
二、编程代码
package com.yanqi.task11;
public class StudentTest {
public static void main(String[] args) {
// 1.使用有参方式构造Student类型的两个对象并判断是否相等
Student s1 = new Student(1001, "zhangfei");
//Student s2 = new Student(1002, "guanyu");
Student s2 = new Student(1001, "zhangfei");
//Student s2 = s1; // 表示s2和s1都指向了同一个对象,地址相同了
// 下面调用从Object类中继承下来的equals方法,该方法默认比较两个对象的地址,可以查看源码验证
// 当Student类中重写equals方法后,则调用重写以后的版本,比较内容
//boolean b1 = s1.equals(s2);
//Student s3 = null;
//boolean b1 = s1.equals(s3);
//Student s3 = s1;
boolean b1 = s1.equals(s2);
System.out.println("b1 = " + b1); // false true
System.out.println(s1 == s2); // 比较地址 false
System.out.println("----------------------------------------------------------");
// 下面调用从Object类中继承下来的hashCode方法,获取调用对象的哈希码值(内存地址的编号)
// 当Student类中重写hashCode方法后,则调用重写以后的版本
int ia = s1.hashCode();
int ib = s2.hashCode();
System.out.println("ia = " + ia);
System.out.println("ib = " + ib);
System.out.println("----------------------------------------------------------");
// 下面调用从Object类中继承下来的toString方法,获取调用对象的字符串形式:包名.类名@哈希码值的十六进制
// 当Student类中重写toString方法后,则调用重写以后的版本:Student[id = 1001, name = zhangfei]
String str1 = s1.toString();
System.out.println("str1 = " + str1); // com.yanqi.task11.Student@55d
System.out.println(s1); // 当打印一个引用变量时会自动调用toString方法
String str2 = "hello" + s1;
System.out.println("str2 = " + str2);
}
}
三、编译打印
D:\JAVA\jdk-11.0.2\bin\java.exe "-javaagent:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\lib\idea_rt.jar=49684:D:\IntelliJIDEA\IntelliJ IDEA 2019.3.3\bin" -Dfile.encoding=UTF-8 -classpath E:\NO.Z.10000——javaproject\NO.H.00001.javase\javase\out\production\javase com.yanqi.task11.StudentTest
b1 = true
false
----------------------------------------------------------
ia = -1432584938
ib = -1432584938
----------------------------------------------------------
str1 = Student{id=1001, name='zhangfei'}
Student{id=1001, name='zhangfei'}
str2 = helloStudent{id=1001, name='zhangfei'}
Process finished with exit code 0
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通