从数据库里查出一条数据。
查询两次,分别是两个实体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来确定该对象将要具体存储到哪个桶。。。。详情请咨询《数据结构》
分享到:
相关推荐
为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类...
注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...
14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 SortedSet接口与TreeSet类 292 14.6.6 自定义满足Sorted集合的类 293 14.6.7 定制SortedSet的排序规则 296 14.6...
equals和hashcode方法 143 泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...
6.8.3 枚举类的属性、方法和构造器 220 6.8.4 实现接口的枚举类 223 6.8.5 包含抽象方法的枚举类 224 6.9 对象与垃圾回收 225 6.9.1 对象在内存中的状态 226 6.9.2 强制垃圾回收 227 6.9.3 finalize方法 228 ...
4、生成Bean界面新增是否生成字段注释和重写equals,hashCode,toString方法的配置。 5、MyBatis配置界面新增根据所有字段条件查询数据的选项。 6、新增TableGo使用说明书。 7、更新数据库驱动版本,新版的驱动可能不...
实例106 简化hashCode()方法的重写 130 实例107 使用字符串输出对象 132 实例108 简化toString()方法的重写 133 5.6 克隆与序列化 134 实例109 Java对象的假克隆 134 实例110 Java对象的浅克隆 135 实例111 Java对象...
{2.2.2}方法重写/覆盖}{50}{subsection.2.2.2} {2.3}修饰符}{51}{section.2.3} {2.4}父类对象的方法调用}{51}{section.2.4} {2.5}封装}{52}{section.2.5} {2.6}多态}{53}{section.2.6} {2.7}Sample code}{54}...