如何为特定类编写哈希码方法?

2022-09-02 20:09:09

我正在尝试为我的简单类生成一个hashCode()方法,但我没有使用它。我将不胜感激任何帮助。我已经实现了 equals() 方法,如下所示,并且还想知道我是否需要实现 compareTo() 方法。我已经导入了java.lang.Character来使用charact.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;
            }
        }
    }

谢谢。。。


答案 1

要实现哈希码,请覆盖 Object 中的默认实现:

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

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

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

您可以使用此方法生成具有任意数量字段的相当不错的哈希值。

若要实现 compareTo,您需要您的类实现可比较

public class Coord implements Comparable<Coord>

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


答案 2

哈希码是一个(32位),你的数据是(16位),所以我可能只是这样做:intchar

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

这会将前 16 位中的位和后 16 位中的位放在前 16 位中,因此这是此类的完美哈希函数rowcol

如果你重构你的类变得更复杂,我建议使用nullptr的答案。


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

public class Coord implements Comparable<Coord>