Java是否推荐使用hashcode判断是否相等?

Is it recommended to use hashcode to determine equality in Java?

假设我们有一个 hashcode() 函数,然后将在我们的 equals() 方法中使用它来确定两个对象是否相等。这是 allowed/accepted 方法吗?

假设我们使用哈希码的简单实现。 (例如几个实例变量乘以素数。)

这是一种检查相等性的糟糕方法,主要是因为对象不必等于 return 相同的哈希码。

为此你应该始终使用 equals 方法。

一般规则是:

If the equals method returns true for Objects a and b, the hashCode method must return the same value for a and b.

This does not mean, that if the hashCode method for a and b returns the same value, the equals method has to return true for these two instances.

例如:

public int hashCode(){
  return 5;
}

是一个有效的哈希码实现,尽管它是低效的。

编辑:

在 equals 方法中使用它是这样的:

public class Person{

private String name;

public Person(String name){ this.name = name;}

public String getName(){ return this.name;}

@Override
public boolean equals(Object o){
  if ( !(o instanceof Person)){ return false;}
  Person p = (Person)o;
  boolean nameE = this.name == null ? p.getName() == null : this.name.equals(p.getName());
  boolean hashE = nameE ? true : randomTrueOrFalse();
  // the only moment you're sure hashE is true, is if the previous check returns true.
  // in any other case, it doesn't matter whether they are equal or not, since the nameCheck returns false, so in best case, it's redundant
  return nameE && hashE;
}

@Override
public int hashCode(){
  int hash = generateValidHashCode();
  return hash;
}

}

这是一种非常糟糕的做法。散列应该具有最小数量的冲突,但通常对象的可能性比可能的散列数量更多,并且由于鸽巢原则,一些不同的对象必须具有相同的散列。

比较哈希时,有一定几率得到"false positives"。

不要这样做

虽然您需要成对覆盖 equals() 和 hashCode() 是正确的,但具有相同的哈希值并不等同于具有相同的值。

努力认真思考平等问题。不要在这里走捷径它会咬你一口

其实也不错!

但请确保您使用此方法来确定不平等,而不是平等。散列代码可能比检查相等性更快,尤其是存储散列代码时(例如 java.lang.String)。

如果两个对象具有不同的哈希码,它们 必须 不同,否则它们 可能 相同。例如你可以像下面这样使用这个方法

Object a, b;
if(a.hashCode() == b.hashCode()){
    if(a.equals(b)) return true;
}

return false;

请注意,在某些情况下,上面的代码可能比仅使用 equals() 慢,尤其是在大多数情况下 a 等于 b.

来自 Object.java 的文档:

  • If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
  • It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.