为什么默认的Object.toString()返回hashCode的十六进制表示?

Tom*_*sky 10 java hash tostring hashcode

我很好奇为什么要Object.toString()回报这个:

return getClass().getName() + "@" + Integer.toHexString(hashCode());
Run Code Online (Sandbox Code Playgroud)

与此相反:

return getClass().getName() + "@" + hashCode();
Run Code Online (Sandbox Code Playgroud)

将哈希码显示为十六进制而不是十进制有什么好处?

Kon*_*lph 9

Object.hashCode过去是根据对象所在的内存位置计算.内存位置几乎普遍显示为十六进制.

默认返回值对toString哈希代码不是那么感兴趣,而是以一种方式来唯一地标识对象以进行调试,并且哈希代码很好地用于识别目的(实际上,类的组合) name +内存地址确实是唯一的;虽然哈希码不能保证是唯一的,但它通常很接近.

  • 严格来说,它是`Object.hashCode()`,它返回一个数字*,对于某些JVM*,是基于第一次调用方法*时对象*的位置.GC可以重定位对象,但`hashCode`必须保持不变. (13认同)
  • 实际上**是否有任何**JVM返回内存位置? (4认同)
  • "`Object.hashCode`默认返回内存地址"的声明对于过去十年发布的所有Sun/Oracle JVM都是错误的,参见http://stackoverflow.com/questions/16105420/java-object-hashcode-address - 或随机/ 16105878#16105878.你是否考虑过其他一些JVM实现,或者你的意思是说hashCode**用于**返回一个内存位置? (3认同)
  • 文档终于得到了修复,首先[他们删除了“通常”](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/Object.html# hashCode()) 说它“*可能会也可能不会在某个时间点被实现为对象内存地址的某些函数*”,然后,[他们完全删除了地址的提及](https://docs.oracle .com/en/java/javase/16/docs/api/java.base/java/lang/Object.html#hashCode()),这是一个很好的决定,恕我直言。 (2认同)

Mik*_*kis 9

我不喜欢接受的答案.这是我的答案.

简短回答:因为十六进制更容易记忆,因为以十六进制表示的数字更短,并且具有比以十进制表示的相同数字更大的字符种类.

更长的答案:你不会使用哈希代码在头脑中进行算术运算,所以你真的不需要它是十进制的.另一方面,您很可能会以打算使用它的唯一方式使用它,也就是说,判断两个哈希码是指同一个对象,还是指不同的对象.换句话说,您将使用它作为对象的唯一标识符或助记符.因此,它是一个数字的事实是无关紧要的; 你不妨把它想象成一个哈希字符串.好吧,我们的大脑发现它更容易保留(为了比较的目的)由16个不同字符组成的短字符串,而不是仅由10个不同字符组成的较长字符串.

  • 在相关的说明中,如果数字以十进制显示,人们可能更倾向于期望它们"意味着"某些东西.例如,"Fnord#194"听起来比第194个Fnord更像"Fnord @ 159C8EA5".从助记符的角度来看,其他字母数字编码可能更短,更容易区分,但我认为Java希望避免产生任何可能被认为具有攻击性的字母序列的可能性. (3认同)