Java:ToString()每次都打印相同的哈希码

时间:2014-12-31 06:48:36

标签: java object tostring hashcode ocpjp

class Point {
    private int xPos, yPos;

    public Point(int x, int y) {
        xPos = x;
        yPos = y;
    }
    public static void main(String[] args) {
        System.out.println(new Point(10,20));
    }
}

上面代码的输出返回对象哈希码的相同ClassName @hex版本,尽管我所指的文本(S G Ganesh和Tushar Sharma的OCPJP指南)声明“每个实例的十六进制值都不同”。我不能正确理解这个吗?

5 个答案:

答案 0 :(得分:3)

对于hashCode #JavaDoc

  

每当在同一个对象上多次调用它时   执行Java应用程序时,hashCode方法必须始终如一   返回相同的整数......

这里你谈的是ClassName@hex在执行程序时会保持不变但是如果你一次又一次地运行程序,你可能会每次或相同的几次使这种表示不同,因为它依赖于hashcode和受内存分配的限制。

答案 1 :(得分:2)

尝试制作两个实例,

System.out.println(new Point(10, 20));
System.out.println(new Point(10, 20));

你会得到两个不同的hashCodes。

答案 2 :(得分:2)

您无法预测将在您的参考上调用的hashCode,但您可以发现始终hashcode将是唯一的。默认情况下,toString()打印您的类继承自Object类的hashCode()。 首先,您应该知道何时使用哈希码。如果您编写以下代码,您将看到继承的Object的hashCode()实现的两个不同的哈希码。

public class Point {

    private int xPos, yPos;
    public Point(int x, int y) {
        xPos = x;
        yPos = y;
    }
    public static void main(String[] args) {
        System.out.println(new Point(10,20));
        System.out.println(new Point(10,20));
    }
}

但如果你想将你的对象插入HashSet,HashMap集合中,它就无法工作。为此,您必须覆盖Point类中的hashCode()。我无法编写代码,但是重写hashCode()取决于你自己的要求,我不知道......最后我想说的是它是最好的做法在我们的每个自定义classe中实现hashCode(),toString(),equals()方法。

答案 3 :(得分:0)

是啊!...像上面那样做两个并试试......

public static void main(String[] args) {System.out.println(new Point(10,20));}

上面的代码只创建了一个..

答案 4 :(得分:0)

如果您将多次运行相同的程序,那么不确定它将为同一个Object返回相同的HashCode或不同的HashCode。这取决于你的Hashcode()实现。

从应用程序的一次执行到同一应用程序的另一次执行,此整数不需要保持一致。