我很好奇为什么Object.toString()
会返回这个:
return getClass().getName() + "@" + Integer.toHexString(hashCode());
与此相反:
return getClass().getName() + "@" + hashCode();
以十六进制显示哈希码相比于十进制有什么好处?
我很好奇为什么Object.toString()
会返回这个:
return getClass().getName() + "@" + Integer.toHexString(hashCode());
与此相反:
return getClass().getName() + "@" + hashCode();
以十六进制显示哈希码相比于十进制有什么好处?
Binary: com.acme.Foo@11000001110101010110101100100011
Decimal: com.acme.Foo@3251989283
Hexadecimal: com.acme.Foo@C1D56B23
Tetrasexagesimal: com.acme.Foo@31rMiZ
你更喜欢哪一个?
我肯定更喜欢六十进制,如果没有的话,我会选择十六进制。大多数人都会同意这个选择。
你可以在这里的网站上进行转换: https://www.mobilefish.com/services/big_number/big_number.php
Object.hashCode
曾经是基于对象内存位置计算的。几乎所有的内存位置都以十六进制形式显示。
toString
的默认返回值并不太关心哈希码,而更关心一种用于调试的唯一标识对象的方式,哈希码在此方面提供了良好的服务(事实上,类名+内存地址的组合是真正独特的;而哈希码虽然不能保证是唯一的,但往往非常接近唯一)。
Object.hashCode()
方法返回一个数字,对于某些JVM而言,该数字基于对象在“方法第一次调用时”的位置。尽管GC可能会重定位对象,但 hashCode
必须保持不变。 - Stephen CObject.hashCode
默认返回一个内存地址”的说法在过去十年中发布的所有Sun/Oracle JVM中都是错误的,参见https://dev59.com/OmQo5IYBdhLWcg3wXuen#16105878。你是否考虑了其他JVM实现,或者你是想说hashCode以前曾经返回过内存位置? - meriton