如何写一个特定类hashCode方法?(How to write hashCode method f

2019-09-01 23:25发布

我想为我的简单类的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;
        }
    }

}

提前致谢...

这是给我java.lang.Comparable的铸造错误comparTo()方法..

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;
            }
        }
    }

谢谢...

Answer 1:

要实现的hashCode,重写Object对象的默认实现:

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

这是不是一个真正的理想的哈希值,因为它的结果是非常明确,很容易对两个不同的Coord对象返回相同的值。 一个更好的哈希会利用内置的Arrays从类java.util ( 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,你会希望你的类实现可比 :

public class Coord implements Comparable<Coord>

一旦你做到了这一点,你可以采取的compareTo类型的参数Coord ,而不是类型Object ,这将节省您检查其类型的麻烦。



Answer 2:

哈希码是int (32位),您的数据char (16位),所以我可能只是做:

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

这使从位row在第16位,从位col在最后16位,所以这是一个完美的哈希函数这个类。

如果你重构你的类要复杂的多,我建议使用nullptr的答案。


要使用Comparable ,这样做:

public class Coord implements Comparable<Coord>


Answer 3:

我发现关于这个主题和许多其他议题的非常有价值的信息, 有效的Java书,由约书亚·布洛克写的 。 请看第45页关于hashCode()方法的详细信息和equals()。

如果您使用的IDE像Eclipse你可以让它产生hashCode()equals()的方法。 为你的类的结果将是:

class Coord implements Comparable<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;
    }

    @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;
    }

}


Answer 4:

类似durron597的答案,你可以,如果你的输入被烧焦界试试这个(0到65535之间)

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


文章来源: How to write hashCode method for a particular class?