1、*为什么要重写equals方法,首先我们来看一下equals源码:

 public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}

*可以看出首先判定的是两个类的地址是否一致,如果是同一个类则地址相同,则符合;

*其次如果比较的两个类是String类则比较他们每个字符是否一致,如果一致则符合;

*可以看出,原来的equals方法并没有给出其他类比较的具体依据,如果两个Person类如果id一直我们则认为相同,

所以持久化时,hibernate会调用equals方法判断两个实体是否相同,即:数据库中两行是否一样,我们必须给出判定方法,原来的equals是不够用的

  2、*为什么要重写Hashcode方法,我们任然来看一段代码:

 import java.util.HashSet;

 public class Test {

     String name;

     public Test(String name) {
this.name = name;
} public static void main(String[] args) {
// TODO Auto-generated method stub HashSet<Test> hs=new HashSet<Test>();
Test t1=new Test("abc");
Test t2=new Test("abc");
System.out.println(t1.equals(t2));
hs.add(t1);
hs.add(t2);
System.out.println(hs.size());
} @Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
if (this == obj)
return true;
else if (obj instanceof Test) {
String name = ((Test) obj).name;
if (this.name.equals(name))
return true;
else
return false;
} else
return false;
} }

*上面代码运行结果为:

true
2

我们发现当我们重写equals后,破坏了一些Java规则:如果两个对象相等,则不能放到HashSet集合中,但上面的结果恰恰相反,两个对象相等,却任然能放到HashSet中

*由此我们可以看出,放入HashSet集合时,并没有调用equals方法,那HashSet判断两个对象相等调用的是什么方法呢?很显然调用了HashCode方法,当我们重写Hashcode方法后,就会满足上述规则,所以重写equals方法后必须重写hashcode方法;

  3、总结:equals和hashcode方法是重两个不同角度判断对象相等的,但前提是他们的效果必须一致:即有一个判断相等,则另一个必须判断为相等;

Hibernate中为什么要重写equals方法和hashcode方法的更多相关文章

  1. HashSet中存方用户自己定义数据类型数据,重写equals方法和hashCode方法

    import java.util.Set; import java.util.HashSet; public class SetTest { public static void main(Strin ...

  2. HashSet中的元素必须重写equals方法和hashCode方法

    http://jingyan.baidu.com/article/d5a880eb8fb61d13f147cc99.html 1.为什么必须重写这两个方法. 2.什么事hashSet去重,符合什么样的 ...

  3. 对象作为 map 的 key 时,需要重写 equals 方法和 hashCode 方法

    对象作为 map 的 key 时,需要重写 hashCode 和 equals方法 如果没有重写 hashCode 方法,那么下面的代码示例会输出 null 我们首先定义一个对象:BmapPoint, ...

  4. JAVA正确地自定义比较对象---如何重写equals方法和hashCode方法

    在实际应用中经常会比较两个对象是否相等,比如下面的Address类,它有两个属性:String province 和 String city. public class Address { priva ...

  5. Java重写equals方法和hashCode方法

    package com.ddy; public class User {     private Integer id;     private String name;     private St ...

  6. 关于Object类的equals方法和hashCode方法

    关于Object类的equals的特点,对于非空引用: 1.自反性:x.equals(x) return true : 2.对称性:x.equals(y)为true,那么y.equals(x)也为tr ...

  7. Java 如何重写对象的 equals 方法和 hashCode 方法

    前言:Java 对象如果要比较是否相等,则需要重写 equals 方法,同时重写 hashCode 方法,而且 hashCode 方法里面使用质数 31.接下来看看各种为什么. 一.需求: 对比两个对 ...

  8. 详解equals()方法和hashCode()方法

    前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...

  9. Java基础系列-equals方法和hashCode方法

    原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述         equals方法和hashCode方法都是有Object类定义的. publi ...

随机推荐

  1. #include <mutex>

    多线程初级 #include <iostream> #include <thread> #include <windows.h> #include <mute ...

  2. php将文件夹打包成zip文件

    function addFileToZip($path,$zip){    $handler=opendir($path); //打开当前文件夹由$path指定.    while(($filenam ...

  3. sql server操作2:查询数据库语句大全【转】

    注:以下操作均建立在上篇文章sql Server操作1的数据基础之上 一.实验目的 熟悉SQL语句的基本使用方法,学习如何编写SQL语句来实现查询 二.实验内容和要求 使用SQL查询分析器查询数据,练 ...

  4. C#.NET学习笔记7--11---算术运算符,变量赋值,变量的交换,布尔表达式1,布尔表达式2

    C#.NET学习笔记7---算术运算符 2013/9/6 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 1.Consol ...

  5. Linux 07 故障恢复

    1. 模拟MBR扇区被破坏后的修复. MBR故障恢复: 1.备份 添加硬盘 启动操作系统: 添加硬盘: 对分区格式化: 挂载: 做备份: 破坏MBR 重启系统: 关闭虚拟机 设置光盘启动 救援模式: ...

  6. C#中的线程(一)入门 转

    文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari,  翻译 Swanky Wu 中文翻译作者把原文放在了& ...

  7. zxing源码分析——QR码部分

    Android应用横竖屏切换 zxing源码分析——DataMatrix码部分 zxing源码分析——QR码部分 2013-07-10 17:16:03|  分类: 默认分类 |  标签: |字号大中 ...

  8. 自学HTML5第二节(标签篇---新增标签详解)

    HTML5新增标签: <article> 标签 规定独立的自包含内容.一篇文章应有其自身的意义,应该有可能独立于站点的其余部分对其进行分发. <article> 元素的潜在来源 ...

  9. binwalk windows安装和使用方法

    binwalk是一个文件的分析工具,旨在协助研究人员对文件进行分析,提取及逆向工程.简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展. 以上是binwalk ...

  10. VI 配置文件(略全)

    配置 ~/.vimrc文件. root则放到/etc/vimrc 具体详见代码 "====================================================== ...