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

Java 如何为特定类编写hashCode方法?,java,class,character,hashcode,compareto,Java,Class,Character,Hashcode,Compareto,我正试图为我的简单类生成一个hashCode()方法,但我没有成功。我将感谢任何帮助。我已经实现了equals()方法,如下所示,还想知道是否需要实现compareTo()方法。我已导入java.lang.Character以使用Character.hashCode(),但它似乎不起作用 private class Coord{ private char row; private char col; public Coord(char x, char y){

我正试图为我的简单类生成一个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;
            }
        }
    }
public int compareTo(对象副本){
if(copy==null){
抛出新的NullPointerException(“输入的对象为空”);
}
如果(copy.getClass()!=this.getClass()),则为else{
抛出新的IllegalArgumentException(“输入的对象不协调”);
}
否则{
Coord copy2=(Coord)副本;
if(copy2.row==this.row&©2.col==this.col){
返回0;
}
else if(copy2.col

感谢…

要实现hashCode,您需要覆盖对象的默认实现:

@Override
public int hashCode()
{
    return row ^ col;
}
这并不是一个理想的散列,因为它的结果是非常可预测的,而且两个不同的
Coord
对象很容易返回相同的值。更好的散列将使用
java.util
()中内置的
数组
类:

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

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

公共类协作实现可比性

完成此操作后,您可以进行比较以获取类型为
Coord
的参数,而不是类型为
Object
,这样可以省去检查其类型的麻烦。

Hashcode是一个
int
(32位),您的数据是
char
(16位),因此我可能会:

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

我在网上找到了关于这个话题和许多其他话题的非常有价值的信息。有关hashCode()和equals()的更多信息,请参阅第45页

如果使用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;
    }

}
类协作实现可比性{
私有字符行;
私有字符集;
公共合作社(char x,char y){
行=x;
col=y;
}
公共合作{
};
公共字符getX(){
返回行;
}
公共字符(){
返回列;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
结果=素数*结果+列;
结果=素数*结果+行;
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
协调其他=(协调)obj;
if(col!=其他.col)
返回false;
if(行!=其他.row)
返回false;
返回true;
}
公共整数比较(坐标参数){
//按照http://docs.oracle.com/javase/7/docs/api/java/lang/Comparable.html
返回0;
}
}

与durron597的答案类似,如果您的输入以字符为界(介于0和65535之间),则可以尝试此方法


如果您使用的是
Arrays.hashCode(Object[]args)
,则不需要Java 7,它从1开始就一直使用Java。5@durron597我还编写了一个comparTo()方法,它看起来像
public int compareTo(Object copy){if(copy==null){抛出新的NullPointerException(“输入的对象为空”);}else if(copy.getClass()!=this.getClass()){抛出新的IllegalArgumentException(“输入的对象不是Coord”);}else{Coord copy2=(Coord)copy;if(copy2.row==this.row&©2.col==this.col){return 0;}else if(copy2.col
但我一直觉得Coord不能转换为java.lang.Comparable。我可以知道为什么吗?@AdityaGore你应该在一个单独的问题中问这个问题。@durron597对此表示抱歉。我已经编辑了我的问题,并在这里添加了附加内容。我不知道对于类似的问题,两篇不同的帖子是否合适!!你说
返回行^col
>“这并不是一个理想的散列,因为……两个不同的
Coord
对象很容易返回相同的值。”我读了一篇文章,它说,“这是一个普遍的误解,认为hashCode为一个对象提供了唯一的标识符。事实并非如此。”你能详细说明一下这个问题吗?谢谢!我想这会对你有所帮助。如果我错了,请原谅我,但你永远不会发生碰撞;可能的对象似乎与可能的哈希代码一一对应。这应该非常快,所以这是一个很棒的答案。是的。“不太可能”这其实是一对字符的完美哈希函数;当且仅当两个对象表示相等的值时,两个对象将具有相同的哈希代码。@CoryKendall请记住,
HashMap
hashCode()上使用模
value,它不包含2^32个可能的单元格。因此对于某些字符和模块以及
HashMap
大小,它仍然会有冲突。但是,我同意我可以更好地表述它:)@CoryKendall我更改了措辞以更准确;)我知道这是一个非常典型的实现,但它有一些棘手的数字downsides。如果您只有两个正在散列的组件(比如这里),并且它们都有相同的值(这不是一个不寻常的现象),这相当于
32*散列+偏移量
,它的熵比源散列少5位。这不理想。这个答案是多余的,虽然它是正确的,但它很棘手,因为它包含一个非obvi
@Override
public int hashCode() {
    return (row << 16) + col;
}
public class Coord implements Comparable<Coord>
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;
    }

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