文档章节

Java高级-hashcode与equals方法使用

陶邦仁
 陶邦仁
发布于 2012/11/18 15:19
字数 690
阅读 518
收藏 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时,才会加载该属性值。

© 著作权归作者所有

共有 人打赏支持
陶邦仁
粉丝 1589
博文 420
码字总数 1483822
作品 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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
3
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
85
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部