在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。

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

  使用hashCode()和equals()

  hashCode()方法被用来获取给定对象的整数。这个整数被用来确定对象被存储在HashTable类似的结构中的位置。默认的,Object类的hashCode()方法返回这个对象存储的内存地址的编号。

  重写默认的实现

  如果你不重写这两个方法,将几乎不遇到任何问题,但是有的时候程序要求我们必须改变一些对象的默认实现。

  来看看这个例子,让我们创建一个简单的类Employee

    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; 
        } 
    }

  上面的Employee类只是有一些非常基础的属性和getter、setter。现在来考虑一个你需要比较两个employee的情形。

    public class EqualsTest { 
        public static void main(String[] args) { 
            Employee e1 = new Employee(); 
            Employee e2 = new Employee(); 
            e1.setId(100); 
            e2.setId(100); 
            //Prints false in console
            System.out.println(e1.equals(e2)); 
        } 
    }