对于HashCode的一些疑问!

执行此程序

 public class Test {

    public static void main(String[] args) {
        Emp emp = new Emp();
        System.out.println(emp);
        System.out.println(emp.hashCode());
    }
}
class Emp{
    String id;
    String name;
}

输出

 Emp@15db9742
366712642

谁能解释一下,这两个值代表什么

366712642这个值代表的是emp对象的hashcode(hashcode是根据hash算法计算出来的)
那第一个值是什么东西?emp@后面为什么不是哈希值?

首先我们把代码稍微改一下:

  public class Test {

    public static void main(String[] args) {
        Emp emp = new Emp();
        System.out.println(emp.toString());
        System.out.println(emp.hashCode());
    }
}
class Emp{
    String id;
    String name;
}

改的地方是main方法第二行,本来你写的是emp,改成emp.toString();

你会发现执行结果和你的执行结果几乎可以说是一样。因为调用println方法,底层会默认调用toStrintg()

所以现在我们只要 弄清hashCode()与 toString()方法有什么区别就行了。

现在看看hashCode()方法,点进去,看代码注释:

返回对象的哈希码值。支持该方法以利于哈希表,例如由java.util.HashMap提供的哈希表。

hashCode的一般合同是:
•无论何时在Java应用程序执行期间在同一对象上多次调用同一对象时,如果对对象的equals比较中使用的信息不被修改,则hashCode方法必须始终返回相同的整数。从应用程序的一个执行到相同应用程序的另一个执行,此整数不需要保持一致。
•如果根据equals(Object)方法两个对象相等,则对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果。
•如果根据java.lang.Object.equals(java.lang.Object)方法,两个对象不相等,则不需要调用这两个对象中的每一个上的hashCode方法,这些方法必须产生不同的整数结果。然而,程序员应该意识到,为不等对象产生不同的整数结果可以提高散列表的性能。

尽管合理实用,但Object类定义的hashCode方法会为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

从最后一句话你能看出,hashCode是根据对象内部地址获得的,你就简单理解为内存地址。

toString呢?

     public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

看见没,将hashCode转为16进制显示了。所以你的问题就能解答了。他们都是hashCode,只是不同进制而已,一个十进制,一个16禁止。
值一样的。

应该是16进制的hashcode值。

emp是类名,@后面是对象地址吧