首先我们把代码稍微改一下:
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禁止。
值一样的。