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

时间:2021-04-23 15:37:59

I'm trying to generate a hashCode() method for my simple class but i'm not getting anywhere with it. I would appreciate any help. I've implemented the equals() method, which looks as follows, and would also like to know if I need to implement compareTo() method. I've imported java.lang.Character to use character.hashCode() but it doesn't seem to work.

我正在尝试为我的简单类生成一个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;
        }
    }

}

Thanks in advance...

提前致谢...

The comparTo() method that is giving me java.lang.Comparable casting error..

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

thanks...

谢谢...

4 个解决方案

#1


16  

To implement hashCode, you override the default implementation from Object:

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

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

This isn't really an ideal hash, since its results are very predictable and it is easy for two different Coord objects to return the same value. A better hash would make use of the built-in Arrays class from java.util (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html):

这不是一个理想的哈希值,因为它的结果是非常可预测的,并且两个不同的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)});
}

You can use this method to generate a pretty good hash with any number of fields.

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

To implement compareTo, you'll want your class to implement Comparable:

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

public class Coord implements Comparable<Coord>

Once you've done this, you can make compareTo take an argument of type Coord rather than type Object, which will save you the trouble of checking its type.

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

#2


14  

Hashcode is an int (32 bits), your data is char (16 bits), so I would probably just do:

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

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

This puts the bits from row in the first 16 bits and the bits from col in the last 16 bits, so this is a perfect hash function for this class.

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

If you refactor your class to be more complicated, I recommend using nullptr's answer.

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


To use Comparable, do:

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

public class Coord implements Comparable<Coord>

#3


5  

I found very valuable information concerning this topic and many other topics in the Effective Java book, written by Joshua Bloch. Look at page 45 for further information about hashCode() and equals().

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

If you use an IDE like Eclipse you can let it generate the hashCode() and equals() methods. For your class the result would be:

如果您使用像Eclipse这样的IDE,您可以让它生成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;
    }

}

#4


-1  

similar to durron597's answer, you can try this if your input is bounded by char (between 0 and 65535 )

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

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

#1


16  

To implement hashCode, you override the default implementation from Object:

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

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

This isn't really an ideal hash, since its results are very predictable and it is easy for two different Coord objects to return the same value. A better hash would make use of the built-in Arrays class from java.util (http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html):

这不是一个理想的哈希值,因为它的结果是非常可预测的,并且两个不同的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)});
}

You can use this method to generate a pretty good hash with any number of fields.

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

To implement compareTo, you'll want your class to implement Comparable:

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

public class Coord implements Comparable<Coord>

Once you've done this, you can make compareTo take an argument of type Coord rather than type Object, which will save you the trouble of checking its type.

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

#2


14  

Hashcode is an int (32 bits), your data is char (16 bits), so I would probably just do:

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

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

This puts the bits from row in the first 16 bits and the bits from col in the last 16 bits, so this is a perfect hash function for this class.

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

If you refactor your class to be more complicated, I recommend using nullptr's answer.

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


To use Comparable, do:

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

public class Coord implements Comparable<Coord>

#3


5  

I found very valuable information concerning this topic and many other topics in the Effective Java book, written by Joshua Bloch. Look at page 45 for further information about hashCode() and equals().

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

If you use an IDE like Eclipse you can let it generate the hashCode() and equals() methods. For your class the result would be:

如果您使用像Eclipse这样的IDE,您可以让它生成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;
    }

}

#4


-1  

similar to durron597's answer, you can try this if your input is bounded by char (between 0 and 65535 )

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

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