java中具有相同散列值但equals方法的2个对象的示例在它们上返回false

时间:2014-03-10 18:17:45

标签: java override equals hashcode

我们都知道如果equals方法返回true,那么两个对象是相等的。

任何人都可以举例说明两个对象具有相同的hash值,但它们实际上是不同的吗?

3 个答案:

答案 0 :(得分:1)

我假设您熟悉与覆盖equals()hashCode()相关的合同,以及易于碰撞的hashCode实现的含义。鉴于此,下面的简单示例使用一个包含两个Integers的对象并实现一个非常简单的hashCode,并演示了两个不相等但具有相同hashCode的对象是多么容易。提供更复杂的hashCode算法可以缓解这种情况。

运行main的输出是:

hashCodes: ih1: 6, ih2: 6
equals: false

示例代码:

package example.stackoverflow;

public class IntHolder
{
    private Integer primaryData;
    private Integer secondaryData;

    public IntHolder(Integer primaryData, Integer secondaryData)
    {
        this.primaryData = primaryData;
        this.secondaryData = secondaryData;
    }

    @Override
    public int hashCode()
    {
        return ((primaryData == null) ? 0 : primaryData.hashCode()) + 
               ((secondaryData == null) ? 0 : secondaryData.hashCode());
    }

    @Override
    public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        IntHolder other = (IntHolder) obj;
        if (primaryData == null)
        {
            if (other.primaryData != null)
                return false;
        }
        else if (!primaryData.equals(other.primaryData))
            return false;
        if (secondaryData == null)
        {
            if (other.secondaryData != null)
                return false;
        }
        else if (!secondaryData.equals(other.secondaryData))
            return false;
        return true;
    }

    public static void main(String[] args)
    {
        IntHolder ih1 = new IntHolder(1, 5);
        IntHolder ih2 = new IntHolder(3, 3);

        System.out.println("hashCodes: ih1: " + ih1.hashCode() + ", ih2: " + ih2.hashCode());
        System.out.println("equals: " + ih1.equals(ih2));
    }
}

作为参考,Eclipse为IntHolder类自动生成的hashCode()是:

@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result
            + ((primaryData == null) ? 0 : primaryData.hashCode());
    result = prime * result
            + ((secondaryData == null) ? 0 : secondaryData.hashCode());
    return result;
}

答案 1 :(得分:1)

String str1="abcdef";
String str2="abcdfG";

它们都具有相同的哈希码,equals方法返回false。

答案 2 :(得分:0)

public class Employee {

protected long   employeeId;

public boolean equals(Object o){
if(o == null)                return false;
if(!(o instanceof) Employee) return false;

Employee other = (Employee) o;
return this.employeeId == other.employeeId;

}

public int hashCode(){
return (int) this.employeeId;

}

}

在这个例子中,我们覆盖了equals方法 - 当两名员工拥有相同的员工ID时,他们是平等的。

如果两个Employee对象相等,它们也将具有相同的哈希码。

你的答案 -

在这个例子中,我们还实现了哈希码 - 哈希码是employeeId,向下舍入为int。这意味着许多员工ID可能会导致相同的哈希代码,但这些员工对象仍然不相等,因为他们没有相同的员工ID。