毫无疑问,上面的程序将输出false,但是,事实上上面两个对象代表的是通过一个employee。真正的商业逻辑希望我们返回true。

  为了达到这个目的,我们需要重写equals方法。

    public boolean equals(Object o) { 
            if(o == null) 
            { 
                return false; 
            } 
            if (o == this) 
            { 
               return true; 
            } 
            if (getClass() != o.getClass()) 
            { 
                return false; 
            } 
            Employee e = (Employee) o; 
            return (this.getId() == e.getId()); 
    }

  在上面的类中添加这个方法,EauqlsTest将会输出true。

  So are we done?没有,让我们换一种测试方法来看看。

    import java.util.HashSet; 
    import java.util.Set; 
    
    public class EqualsTest 
    { 
        public static void main(String[] args) 
        { 
            Employee e1 = new Employee(); 
            Employee e2 = new Employee(); 
    
            e1.setId(100); 
            e2.setId(100); 
    
            //Prints 'true' 
            System.out.println(e1.equals(e2)); 
    
            Set<Employee> employees = new HashSet<Employee>(); 
            employees.add(e1); 
            employees.add(e2); 
            //Prints two objects 
            System.out.println(employees); 
        }

  上面的程序输出的结果是两个。如果两个employee对象equals返回true,Set中应该只存储一个对象才对,问题在哪里呢?

  我们忘掉了第二个重要的方法hashCode()。像JDK的Javadoc中所说的一样,如果重写equals()方法必须要重写hashCode()方法。我们加上下面这个方法,程序将执行正确。

    @Override
     public int hashCode() 
     { 
        final int PRIME = 31; 
        int result = 1; 
        result = PRIME * result + getId(); 
        return result; 
     }