Java高级-hashcode与equals方法使用
Java高级-hashcode与equals方法使用
陶邦仁 发表于6年前
Java高级-hashcode与equals方法使用
  • 发表于 6年前
  • 阅读 508
  • 收藏 1
  • 点赞 1
  • 评论 0

移动开发云端新模式探索实践 >>>   

在本文中,我将说下关于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时,才会加载该属性值。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1545
博文 388
码字总数 1483822
×
陶邦仁
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: