Java的Object的hashcode()和equals()

    技术2025-04-27  22

    0.背景

    hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。

     1. 使用

    hashCode()方法被用来获取给定对象的唯一整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。

    默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。

     

     2. JDK的Javadoc中所说,如果重写equals()方法必须要重写hashCode()方法

    尽量保证使用对象的同一个属性来生成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(); } }

    3.注意的问题:

    - 尽量保证使用对象的同一个属性来生成hashCode()和equals()两个方法。

    - eqauls方法必须保证一致(如果对象没有被修改,equals应该返回相同的值)任何时候只要a.equals(b),那么a.hashCode()必须和b.hashCode()相等。

    - 两者必须同时重写。

    Processed: 0.017, SQL: 12