如何为特定类编写hashCode方法?

我正在尝试为我的简单类生成一个hashCode()方法,但我没有得到它的任何地方。 我将不胜感激任何帮助。 我已经实现了equals()方法,如下所示,并且还想知道我是否需要实现compareTo()方法。 我已经导入了java.lang.Character来使用character.hashCode()但它似乎不起作用。

private class Coord{ private char row; private char col; public Coord(char x, char y){ row = x; col = y; } public Coord(){}; public char getX(){ return row; } public char getY(){ return col; } public boolean equals(Object copy){ if(copy == null){ throw new NullPointerException("Object entered is empty"); } else if(copy.getClass()!=this.getClass()){ throw new IllegalArgumentException("Object entered is not Coord"); } else{ Coord copy2 = (Coord)copy; if(copy2.row==this.row && copy2.col==this.col) return true; else return false; } } } 

提前致谢…

comparTo()方法给了我java.lang.Comparable转换错误..

 public int compareTo(Object copy){ if(copy==null){ throw new NullPointerException("Object entered is empty"); } else if(copy.getClass()!=this.getClass()){ throw new IllegalArgumentException("Object entered is not Coord"); } else{ Coord copy2 = (Coord)copy; if(copy2.row==this.row && copy2.col==this.col){ return 0; } else if(copy2.col < this.col){ return -1; } else{ return 1; } } } 

谢谢…

要实现hashCode,您可以覆盖Object的默认实现:

 @Override public int hashCode() { return row ^ col; } 

这不是一个理想的哈希值,因为它的结果是非常可预测的,并且两个不同的Coord对象很容易返回相同的值。 更好的哈希将使用java.util中的内置Arrays类( http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html ):

 @Override public int hashCode() { return Arrays.hashCode(new Object[]{new Character(row), new Character(col)}); } 

您可以使用此方法生成包含任意数量字段的非常好的哈希。

要实现compareTo,您需要您的类实现Comparable :

 public class Coord implements Comparable 

完成此操作后,您可以使compareTo采用Coord类型的参数而不是类型Object ,这样可以省去检查其类型的麻烦。

Hashcode是一个int (32位),你的数据是char (16位),所以我可能会这样做:

 @Override public int hashCode() { return (row << 16) + col; } 

这将来自行的位在前16位中,而来自col的位在最后的16位中,因此这是该类的完美散列函数 。

如果你重构你的课程更复杂,我建议使用nullptr的答案。


要使用Comparable ,请执行以下操作:

 public class Coord implements Comparable 

我找到了有关此主题的非常有价值的信息以及Joshua Bloch撰写的Effective Java一书中的许多其他主题。 有关hashCode()和equals()的更多信息,请参见第45页。

如果您使用像Eclipse这样的IDE,您可以让它生成hashCode()equals()方法。 对于您的class级,结果将是:

 class Coord implements Comparable { private char row; private char col; public Coord(char x, char y) { row = x; col = y; } public Coord() { }; public char getX() { return row; } public char getY() { return col; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + col; result = prime * result + row; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Coord other = (Coord) obj; if (col != other.col) return false; if (row != other.row) return false; return true; } public int compareTo(Coord param) { // Implementation according to http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html return 0; } } 

类似于durron597的答案,如果您的输入以char为界(0到65535之间),您可以尝试这个

 public int hashCode(){ return row * 100000 + col; }