包装类java中的奇怪行为

时间:2014-08-05 12:49:54

标签: java

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()方法。 如果我想在上面的代码中找到包装类对象的对象引用。 我该怎么做?

3 个答案:

答案 0 :(得分:5)

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

来自hashCode API,

  

返回对象的哈希码值。支持此方法是为了哈希表的优势,例如HashMap提供的哈希表。

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

如果您仍希望获得对象的原始哈希值,我建议使用System.identityHashCode方法。

System.identityHashCode(a)

答案 1 :(得分:1)

  

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

Wrappers与String一样,是不可变的。这样说,如果一个类的每个不同对象具有不同的值(状态),那么该值就是一个完美的哈希码:零冲突,总熵,同质分布......

  

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

使用System.identityHashCode()

答案 2 :(得分:1)

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