【问题标题】:Java: ToString() prints the same hashcode each timeJava:ToString() 每次打印相同的哈希码
【发布时间】:2014-12-31 06:48:35
【问题描述】:
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 指南)指出“每个实例的十六进制值将不同。”我没有正确理解这一点吗?

【问题讨论】:

  • 您是否一次又一次地运行同一个程序?还是您的意思是您正在创建另一个 Point 实例但获得相同的值?
  • @shree.pat18 :我正在运行相同的程序。

标签: java object tostring hashcode ocpjp


【解决方案1】:

对于hashCode #JavaDoc

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

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

【讨论】:

  • 程序的多次执行是否相同??
【解决方案2】:

尝试创建两个实例,

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

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

【讨论】:

  • 是的,确实发生了。但我想明白的是,运行原程序,每次都应该给我同样的输出吗?
【解决方案3】:

您无法预测将在您的引用上调用的 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() 方法在我们的每个自定义类中。

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 我使用的是默认的 toString 实现。我只想知道多次执行同一程序的输出是否保持不变。
      • 是的,多次执行可能相同,但不确定何时会给出新的 hashCode。更好的是,您可以覆盖 hashCode() 并编写一些表达式来帮助您检查输出。
      猜你喜欢
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      相关资源
      最近更新 更多