文档章节

Java高级-hashcode与equals方法使用

陶邦仁
 陶邦仁
发布于 2012/11/18 15:19
字数 690
阅读 525
收藏 1

在本文中,我将说下关于hashCode和equals方法使用的个人理解,我将在这讨论关于它们的默认实现和怎么正确地重写它们。然后将讨论关于使用Apache Commons 工具包做一个实现。hashCode和equals方法被定义在父类Object类中,因此,所有的Java对象都会继承Object类中的hashCode和equals方法的默认实现。

使用hashCode和equals方法

hashCode方法是被用来获得一个唯一的整数,作为对象的标示。这个整数是用来作为确定对象被存储在HashTable类似的数据结构中的位置。`默认的,Object类的hashCode方法返回对象在内存中的地址编号整数表现。`

equals方法,正如其名,是被用来简单的比较两个对象是否相等。`默认实现是通过对象的引用地址用来比较两个对象是否相等。`

重写默认实现

只要你不去实现这个两个方法,默认的实现是一直工作正常的,但是有时我们不得不需要覆盖这两个方法。

使用Apache Commons 的工具包重写hashCode和equals方法

Apache commons 提供了两种极好的工具类,用来生成hashCode和equals方法。使用如下:

import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Employee {
    private Integer id;
    private String firstname;
    private String lastName;
    private String department;
    
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getFirstname() {
        return firstname;
    }
    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    @Override
    public int hashCode() {
        final int PRIME = 31;
        return new HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
               toHashCode();
    }
    @Override
    public boolean equals(Object o) {
        if (o == null)
           return false;
        if (o == this)
           return true;
        if (o.getClass() != getClass())
           return false;
        Employee e = (Employee) o;
           return new EqualsBuilder().
                  append(getId(), e.getId()).
                  isEquals();
    }
}

另一种选择,如果你正在使用任何的开发工具,它们总是为你提供了能够生成好的hashCode和equals方法的实现结构。例如,Eclipse IDE 生成hashCode和equals方法:

image

重要的几点

1) 要总是使用同一个对象属性,来生成hashCode和equals方法。

2) equals方法必须保持始终一致,如果对象没有修改,则任何时候都返回相同的结果。

3) 任何时候只要a.equals(b)为true,那么a.hashCode==b.hashCode也必须为true。

4) 两者必须同时重写。

使用ORM注意的几点

如果你在使用ORM映射,请确保在hashCode和equals方法中使用的是getter来访问属性,而不是直接使用属性的引用。因为,在ORM中有些属性值是被设置为懒加载模式的,只有在调用getter时,才会加载该属性值。

© 著作权归作者所有

共有 人打赏支持
陶邦仁
粉丝 1613
博文 420
码字总数 1483887
作品 0
海淀
技术主管
私信 提问
Java拾遗:001 - 重写 equals 和 hashCode 方法

重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被设计成可覆盖(override)的。但任何一个子类在覆盖这些方法时都应遵守一些通用...

一别丶经年
08/02
0
0
最最最常见的Java面试题总结-第一周

这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。 Github地址:https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试...

Amsour丶
08/08
0
0
scala中的==、equals、eq

scala中equals方法和==是检查值是否相等,而eq方法检查的是引用是否相等。 Scala 的==与Java的有何差别 Java 里的既可以比较基本类型也可以比较引用类型。对于基本类型,Java 的==比较 值比较...

张欢19933
04/27
0
0
图说 Java:理解 Java 机制最受欢迎的 8 幅图

世间总是一图胜过千万言,下面的8幅图来自于 Program Creek 的 Java教程 ,目前这是该网站最受欢迎的文章. 希望本文能帮你回顾你已经知道的那些知识。如果图片讲解的不够清晰,你可能需要阅读详...

大数据之路
2013/10/30
0
3
byte[]作为key存储在HashSet中

byte[]作为key存储在HashSet中 hashCode和equals方法 当使用ide进行开发时,最简单的重写就是用ide自动生成hashCode和equals方法 例如: package hashcode; /** * Created with IntelliJ ID...

秋风醉了
2014/07/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nuc970 uboot nand-boot,kernel, filesystem 烧录位置

一 烧写到Nand Flash **1.1 **相关文件说明 l BSP版本:nuc970bsp-release-20150519.zip l NuWriter版本:2015/04/28-V01,nuvoTon Nu-Writer V1.0 l 烧写文件: u-boot-spl.bin:负责将u-b......

CookieDemo
今天
1
0
python中sort和sorted函数小结

L.sort(cmp=None, key=None, reverse=False) sorted(iterable, cmp=None, key=None, reverse=False) 这样看,sorted函数只比sort函数多一个iterable参数,其余没什么不同,iterable是一个迭代......

上官夏洛特
今天
3
0
thinkphp 常用SQL执行语句总结

第一条:Db::tablera('vr_panomas')->where(['delete_time'=>0,'id'=>['in',$pids]])->field(['id'=>'id','post_thumb'=>'thumb','post_title'=>'title','post_tags'=>'tags','post_price'=>......

koothon
今天
5
0
支付宝返回状态resultStatus意思

上一篇集成支付宝的时候,会有一些支付宝返回的resultStatus,具体意思是: 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 还有memo,意思就是...

RainOrz
今天
3
0
electron webview 页面加载事件顺序

1.did-start-loading 页面开始加载 2.load-commit 主页面文档加载 3.page-title-updated title 4.dom-ready 主页面 dom 加载完成 5.load-commit frame文档加载 6.did-frame-finish-load fram......

dubox
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部