我们都知道如果equals
方法返回true
,那么两个对象是相等的。
任何人都可以举例说明两个对象具有相同的hash
值,但它们实际上是不同的吗?
答案 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。