// 非常重要的编辑...
Gjorgji,我知道您接受下面的答案是正确的,但我发现它是不正确的。
如果你有一堂这样的课:
class tiny {
int a;
public int hashCode() { return a; }
}
您已经用尽了所有可能的哈希码。 (如果不清楚原因,请说明。)
因此,如果您向对象添加任何更多信息,如果您希望在 hashCode 中表示该信息,那么您将在某个地方发生冲突。
但是,就此而言,您并不是真的想获取一个对象 100% 唯一的 hashCode。这确实不是 hashCode 的重点!
hashCode 的目的是为您提供一个“足够唯一”的对象标识符,以便您可以将其放入哈希桶中。与其说它是为了识别,不如说是为了分类。这个想法是,如果你有一大堆对象,你可能不会有很多冲突,所以如果你按哈希码对项目进行分组,你可能会非常快速地访问你正在寻找的东西。
如果这意味着您取消选择我的正确答案,那也没关系。这确实不适合您正在寻找的内容。我希望你能意识到thishashCode 的解释引导您正确使用,从而保持正确性。但正如马克明确指出的那样,这实际上并没有解决你所说的问题。
以下是旧答案:
=================================================== =========
一篇关于它的好文章可以在这里找到,来自Effective Java(这是最好的“我想学习如何成为一名优秀的Java开发人员”书。)
http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ313_029.htm http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ313_029.htm
class Gjorgji {
boolean a;
boolean b;
boolean c;
int x;
int y;
// EDIT: I almost forgot a VERY important rule...
// WHEN YOU OVERRIDE hashCode, OVERRIDE EQUALS (and vice versa)
public int equals(Object o) {
if(!(o instanceof Gjorgji) return false;
Gjorgji g = (Gjorgji)o;
return a == g.a && b == g.b && c == g.c && x == g.x && y == g.y;
}
public int hashCode() {
int hash = x ^ y;
hash *= a ? 31 : 17; // pick some small primes
hash *= b ? 13 : 19;
hash *= c ? 11 : 29;
return hash;
}
}