重写equals()&hashCode()&toString()—Java类设计

很多时候,设计一个类,我们需要重写超类Object中的equals(Object o)、hashCode()以及toString()

  • equals(Object o):比较当前对象与指定对象o的状态(比较两个对象中所有字段的值)是否相同,是即返回true,否则返回false
  • hashCode():获得当前对象的散列码,超类Object中定义的hashCode()会将对象的存储地址作为散列码返回
  • toString():为方便操作而存在,可用于打印对象的状态信息

那么,它们三儿具体应该怎么搞呢?


一、User类

定义一个用于测试的类User,包含两个字段以及对应的get/set方法
- age:用户年龄,int类型
- name:用户名字,String类型
class User{
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

二、重写equals(Object o)

设计步骤:
1. 用“==”判断对象o与当前对象是否为同一个对象,若是则直接返回true
2. 若对象o为null,则直接返回false
3. 根据情况选择使用getClass()方法或instanceOf关键字来判断对象o与当前对象是否为同一类型,若不是则返回false
4. 使用强制类型转换将对象o转化为当前对象类型
5. 依次判断对象o与当前对象中的所有对应字段是否相同,若全部相同则返回true
代码:
class User{
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@override
	public boolean equals(Object o) {
		if(this==o)return true;//1、用“==”判断对象o与当前对象是否为同一个对象,若是则直接返回true
		if(o==null)return false;//2、 若对象o为null,则直接返回false
		if(!(getClass()==o.getClass()))return false;//3、使用getClass()方法来判断对象o与当前对象是否为同一类型,若不是则返回false
		User user=(User)o;//4、使用强制类型转换将对象o转化为当前对象类型User
		return user.getAge()==age&&Objects.equals(name,user.getName());//5、依次判断对象o与当前对象中的所有对应字段是否相同,若全部相同则返回true
	}
}

三、重写hashCode()

设计步骤:
1. 只要重写了equals()方法,则必须重写hashCode()
2. 当a.equals(b)返回true时,a.hashCode()==b.hashCode()也必须返回true
3. 一般直接将所有字段对应的散列码相加即可
4. 多数情况下会添加一个素数31,用于最大可能的保证散列码的唯一;当然31也可以换成7,11,13等(但一定是素数)。大多数人喜欢用31是因为hash*31可以被虚拟机优化为(hash<<5)-hash
代码:
class User{
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@override
	public int hashCode() {
		int hash=0;
		int 
		hash=31*hash+Integer.hashCode(age);//31也可以换成7,11,13等(但一定是素数)。大多数人喜欢用31是因为hash*31可以被虚拟机优化为(hash<<5)-hash
		hash=31*hash+Objects.hashCode(name);
		return hash;
	}
}

四、重写toString

toString()的设计就很简单了,一般都是自定义的格式。下面是java核心思想中推荐的格式来重写的toString():
代码:
class User{
	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@override
	public String toString() {
		return getClass().getName()+
			"[name is:"+getName()+
			",age is:"+getAge()+
			"]";
	}
}

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
目 录 第一章 JAVA入门 10 计算机语言发展史 10 机器语言 10 汇编语言 10 高级语言 10 其他高级语言 11 JAVA发展简史 12 JAVA为什么能够流行? 13 JAVA各版本的含义 13 JAVA技术体系架构 14 JAVA的特性和优势 14 JAVA应用程序的运行机制 15 JVM(JAVA VIRTUAL MACHINE) 16 Java运行时环境JRE(Java Runtime Environment) 17 JAVA语言应用范围 18 第一个JAVA程序 18 JAVA开发环境搭建 18 一个典型的JAVA程序的编写和运行过程 19 第一个程序常见错误 20 第一个JAVA程序的总结和提升 20 常用Java开发工具 20 常用dos命令 21 本章笔试作业 21 本章上机操作 21 第二章(1) 编程的基本概念 22 注释 22 标识符 22 关键字/保留字 23 变量(variable) 24 常量(Constant) 25 命名规则(规范) 25 基本数据型(primitive data type) 26 整型变量 26 浮点型 27 字符型(2个字节): 28 boolean型 29 运算符(operator) 29 二元运算符 29 一元运算符 30 布尔逻辑表达符 30 位运算符 30 扩展运算符 31 字符串连接符 31 三目条件运算符 31 运算符优先级的问题 31 自动型转换 32 基本型转化时常见错误和问题 33 方法 33 简单的键盘输入和输出 33 本章思考作业 34 上机操作 34 第二章(2) 控制语句 35 顺序结构 35 选择结构 35 if单选择结构 35 if-else双选择结构 35 If-elseif-else多选择结构 36 switch多选择结构 37 循环结构 39 While和dowhile的区别 41 For循环 42 break语句和continue语句 47 语句块 48 递归结构 49 本章作业 50 本章上机操作 51 第三章 JAVA面向对象程序开发 52 编程语言发展史 52 和对象是如何产生发展的?如何进化的? 52 面向对象思想初步(OOP初步Object Oriented Programming) 53 面向对象编程的语言的三大特征简介 56 对象和的概念 56 和对象初步 57 测试的定义方式 57 简单的学生编写示例 58 内存分析 59 属性(field,或者叫成员变量) 59 引用型 60 方法 60 对象的创建和使用 60 构造器(或者叫做构造方法,constructor) 60 垃圾回收机制(Garbage Collection) 63 方法的重载(overload),构造方法的重载 63 this关键字 65 static 关键字 66 静态初始化块(经常用来初始化,加载信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? 70 继承使用要点 71 Object 72 toString方法 72 equals方法 73 super关键字 74 方法重写(override) 74 隐藏/封装(encapsulation) 75 为什么需要封装?封装的作用和含义? 75 使用访问控制符,实现封装 76 封装的使用细节 76 多态(polymorphism) 76 为什么需要多态? 76 如何实现多态? 77 方法绑定(method binding) 77 静态绑定 77 动态绑定 77 多态的使用要点 78 对象的转型(casting) 79 final 81 抽象 82 抽象的使用要点 83 接口 83 为什么需要接口? 84 如何定义接口? 84 接口的本质探讨 84 接口使用要点 85 接口的多继承 86 面向接口编程 87 OOP更多应用 87 组合 87 内部(innerclasses) 88 字符串(java.lang.String)的使用 90 字符串相等的判断 92 思考作业 93 上机作业 94 第四章 异常机制 95 导引问题 95 异常(Exception)的概念 96 异常分 96 Error 97 Error和Exception的区别 97 Exception 97 异常的处理办法之一,捕获异常 99 try块 99 catch 99 finally 100 try, catch,finally ,return 执行顺序 100 异常的处理办法之二,声明异常:
以下是Java语言实现的代码: ```java import java.util.Date; public class Student implements Comparable<Student> { private String name; private Date birthday; private int studentId; private String school; public Student(String name, Date birthday, int studentId, String school) { this.name = name; this.birthday = birthday; this.studentId = studentId; this.school = school; } @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", birthday=" + birthday + ", studentId=" + studentId + ", school='" + school + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) return false; Student student = (Student) o; if (studentId != student.studentId) return false; if (!name.equals(student.name)) return false; if (!birthday.equals(student.birthday)) return false; return school.equals(student.school); } @Override public int hashCode() { int result = name.hashCode(); result = 31 * result + birthday.hashCode(); result = 31 * result + studentId; result = 31 * result + school.hashCode(); return result; } @Override public int compareTo(Student o) { return Integer.compare(this.studentId, o.studentId); } } ``` 学生`Student`包含四个成员变量:`name`(姓名)、`birthday`(生日)、`studentId`(学号)、`school`(学校)。构造方法接收这四个参数,并将它们分别赋值给相应的变量。 `Student`实现了接口`Comparable`,并重写了其中的方法`compareTo`,以便按照学号大小进行比较。此外,`Student`还重写方法`toString`、`equals`和`hashCode`,以便在需要打印、比较和哈希的时候能够正确地处理对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黯叶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值