【问题标题】:Wrapper class strange behaviour in javajava中的包装类奇怪行为
【发布时间】:2025-12-25 15:25:10
【问题描述】:
public class Test {
    public static void main(String args[]) {
        int i = 10;
        Integer a = new Integer(i);
        System.out.println(a);        //tostring method overriden
        System.out.println(a.hashCode());
    }
}

输出
10
10

现在我的问题是为什么在这种情况下会覆盖 hashCode() 方法。 如果我想在上面的代码中找到包装类对象a的对象引用。 我该怎么做?

【问题讨论】:

  • 也许这就是你要找的东西*.com/questions/909843/…
  • 通过获得参考你会做什么。仅供参考 Integer 对象在 Java 中是不可变的。一旦创建就无法修改。

标签: java


【解决方案1】:

在您的情况下,对整数的对象引用是a。与 C 不同,在 Java 中,您无法获得指向对象的引用指针。 hashCode 不用于标识内存中对象的地址位置。

来自hashCode API,

返回对象的哈希码值。支持这种方法是为了有利于哈希表,例如 HashMap 提供的哈希表。

事实证明,hashCode 对整数最有效的值就是值本身。

如果你还想获取对象的原始哈希值,我建议使用System.identityHashCode 方法。

System.identityHashCode(a)

【讨论】:

    【解决方案2】:

    我的问题是为什么在这种情况下会覆盖 hashCode 方法

    包装器,如字符串,是不可变的。这么说来,如果一个类的每个不同对象都有不同的值(状态),那这个值就是一个完美的哈希码:零冲突、总熵、同质分布……

    如果我想找到包装类对象的对象引用 在上面的代码中。我该怎么做?

    使用System.identityHashCode()

    【讨论】:

      【解决方案3】:

      在 Java 中,哈希码有助于在两个对象之间提供快速比较提示。由于具有相同值的两个不同Integer 相等,因此它们应该具有相同的哈希值。这就是为什么取值作为哈希值的原因。

      【讨论】: