重写自定义类的equals方法和hashcode方法
程序员文章站
2022-04-04 20:50:19
...
从数据库里查出一条数据。
查询两次,分别是两个实体Bean。
例如:select * from user where id=1
查询两次(不用Hibernate的情况下)分别是两个User对象,
这时需要比较两个对象是否相等(其实是要比较里面的内容是否相等)
JVM在堆中分配了两块内存存储这两个对象
如果单纯的使用equals比较结果肯定为false
可以查看equals方法的源码会发现其实equals比较的也是内存地址
但是我们期望比较的是里面的值啊,也就是说我们期望的结果应该是true
对此,可以学String类一样重写Object类的equals()和hashcode()
给个重写User类的例子:
写一个main函数试一试
最后谈一下,为什么重写equals时也非得重写hashcode,如果去掉重写hashcode那段方法会发现打印结果也是为true。
我举例说明:在映射表或散列表中存储对象时,检查映射表中是否存在该对象的标准就是检查hashcode,同时散列表会根据对象的hashcode来确定该对象将要具体存储到哪个桶。。。。详情请咨询《数据结构》
查询两次,分别是两个实体Bean。
例如:select * from user where id=1
查询两次(不用Hibernate的情况下)分别是两个User对象,
这时需要比较两个对象是否相等(其实是要比较里面的内容是否相等)
JVM在堆中分配了两块内存存储这两个对象
如果单纯的使用equals比较结果肯定为false
可以查看equals方法的源码会发现其实equals比较的也是内存地址
public boolean equals(Object obj) {
return (this == obj);
}
但是我们期望比较的是里面的值啊,也就是说我们期望的结果应该是true
对此,可以学String类一样重写Object类的equals()和hashcode()
给个重写User类的例子:
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 重写equals方法 <br>
* obj为传入的与当前对象相比较的对象
*/
@Override
public boolean equals(Object obj) {
/*
* 判断传入的对象是否是当前类类型 如果不是则直接返回false
*/
if (obj instanceof User) {
User u = (User) obj;
return this.id.intValue() == u.getId().intValue();
}
return false;
}
/**
* 重写hashcode
*/
@Override
public int hashCode() {
// 这里可以写一个用来比较的实体属性
return this.id;
}
}
写一个main函数试一试
public static void main(String[] args) {
User u1 = new User();
u1.setId(1);
User u2 = new User();
u2.setId(1);
System.out.println(u1.equals(u2)); //打印结果为true
}
最后谈一下,为什么重写equals时也非得重写hashcode,如果去掉重写hashcode那段方法会发现打印结果也是为true。
我举例说明:在映射表或散列表中存储对象时,检查映射表中是否存在该对象的标准就是检查hashcode,同时散列表会根据对象的hashcode来确定该对象将要具体存储到哪个桶。。。。详情请咨询《数据结构》
推荐阅读
-
JavaSE的包装类,自动装箱和自动拆箱 ,字符窜转换,toString(),equals(), hashCode()的区别
-
PHP二维数组排序的3种方法和自定义函数分享
-
thinkpad win7 oem 让Nginx支持ThinkPHP的URL重写和PATHINFO的方法分享
-
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间,_PHP教程
-
PHP使用反射机制实现查找类和方法的所在位置_PHP
-
python面向对象编程思维,面向对象概念,类对象,类的方法,继承,方法重写 笔记
-
Java面向对象(1)面向对象的思想概述以及类的介绍,封装和构造方法
-
python 自定义异常和异常捕捉的方法
-
IDEA中如何自定义类的注释和方法的注释
-
Android 入门第十讲02-广播(广播概述,使用方法(系统广播,自定义广播,两个activity之间的交互和传值),EventBus使用方法,数据传递,线程切换,Android的系统广播大全)