文档章节

Java高级-hashcode与equals方法使用

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

© 著作权归作者所有

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

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

一别丶经年
08/02
0
0
用来理解 Java 编程语言的 8 个图表

很多时候,一张图比你说 1000 个字能更有效的说清楚一个问题。我们列举了 8 个关于 Java 语言的图表,或许可以让你对 Java 有着更深入的认识。 1. 字符串不变性(String Immutability) 下面的...

oschina
2013/09/23
7.8K
29
最最最常见的Java面试题总结-第一周

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

Amsour丶
08/08
0
0
byte[]作为key存储在HashSet中

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

秋风醉了
2014/07/02
0
0
scala中的==、equals、eq

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

张欢19933
04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大数据技术的发展趋势

大数据领域已经涌现出了大量新的技术,它们成为大数据采集、存储、处理和呈现的有力武器。这些技术下一步将如何发展?它们之中哪些技术将广为流行?又会诞生哪些新的技术? 技术趋向多样化,...

董黎明
15分钟前
2
0
藏在正则表达式里的陷阱

前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们导出了出问题的堆栈信息。 我们可以看到所...

前端小攻略
17分钟前
0
0
TensorFlow的基础概念01

概念: TensorFlow是一个深度学习框架,人人都能实现机器学习。 import osos.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'import tensorflow as tf#导入对应的TensorFlow#输出Hello W...

怪咖先生forever
17分钟前
0
0
关联更新,关联查询

关联更新 update A,B SET A.c1=B.c1,A.c2=B.c2 where A.id=B.id and ... update A inner join on A.id=B.id set A.c1=B.c1,A.c2=B.c2 where... 关联查询 交叉连接(cross join),内连接(inner ......

关元
20分钟前
0
0
django的环境搭建及启用

Pycharm社区版不像商业版那样可以直接创建django工程,需要通过一下步骤创建: 新建一个用于Django开发的虚拟环境 打开命令窗口 新建虚拟环境: conda create -n env_name python=3.6 查看系...

davidwbnu
21分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部