0
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 版本,尽管我所指的文本(SG Ganesh 和 Tushar Sharma 的 OCPJP 指南)指出“每个实例的十六进制值将不同”。我没有正确理解这一点吗?

4

5 回答 5

3

对于hashCode #JavaDoc

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

在这里,您正在谈论ClassName@hex在程序执行期间哪些将保持不变,但如果您一次又一次地运行程序,您可能会每次或多次获得不同的表示,因为它取决于哈希码并受内存分配的影响。

于 2014-12-31T07:11:53.390 回答
2

尝试制作两个实例,

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

你会得到两个不同的哈希码。

于 2014-12-31T06:54:14.453 回答
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() 取决于您自己的要求,我不知道...
所以最后我想说的是实现 hashCode()、toString()、equals( ) 我们每个自定义类中的方法。

于 2014-12-31T10:10:16.693 回答
0

是的!......像上面一样制作两个并尝试......

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

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

于 2014-12-31T07:17:34.120 回答
0

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

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

于 2014-12-31T09:11:02.123 回答