`
hekuilove
  • 浏览: 156528 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

重写自定义类的equals方法和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来确定该对象将要具体存储到哪个桶。。。。详情请咨询《数据结构》
1
0
分享到:
评论
6 楼 hekuilove 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

5 楼 niva 2012-10-25  
烦死了!!
4 楼 风云无浪 2012-10-25  
其实是用hashCode的时候必须重写equals,只用euqals的话,不用hashCode也无所谓。
hashCode是为了hash的时候查找,而查找后需要比较,就需要equals了
3 楼 kidding87 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"


== 也会判断hashcode
2 楼 sweat89 2012-10-25  
witcheryne 写道
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

天命~~~哈哈......
1 楼 witcheryne 2012-10-25  
hashCode 方法是给 HashMap/ HashSet 用的.

class 栏目 {
     Set<User> users = new HashSet();
}

没有重写 User的 hashCode(),  users 数据会不对.


P.S:
看到你的头像, 条件反射: "杀一下"

相关推荐

    涵盖了90%以上的面试题

    为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类...

    实验05 Java集合.doc

    注意:因为Person类是自定义类,需要重写hashCode()方法和equals()方法,并规定只有姓名和身份证号都相等,则对象相等。 其中计算哈希码的算法:(31 + ((name == null) ? 0 : name.hashCode()))*31 + id (注:...

    javaSE代码实例

    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...

    JAVA基础课程讲义

    equals和hashcode方法 143  泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...

    疯狂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 ...

    基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v5.8.0版_JAR)

    4、生成Bean界面新增是否生成字段注释和重写equals,hashCode,toString方法的配置。 5、MyBatis配置界面新增根据所有字段条件查询数据的选项。 6、新增TableGo使用说明书。 7、更新数据库驱动版本,新版的驱动可能不...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例106 简化hashCode()方法的重写 130 实例107 使用字符串输出对象 132 实例108 简化toString()方法的重写 133 5.6 克隆与序列化 134 实例109 Java对象的假克隆 134 实例110 Java对象的浅克隆 135 实例111 Java对象...

    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}...

Global site tag (gtag.js) - Google Analytics