如果未重写hashCode()方法,那么对Java中的任何对象调用hashCode()的结果是什么?
通常,hashCode()仅在不覆盖对象的情况下返回其在内存中的地址。
从1开始:
在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(通常通过将对象的内部地址转换为整数来实现,但是JavaTM编程语言不需要此实现技术。)
在HotSpot JVM中,默认情况下会在第一次调用时生成未重载Object.hashCode或System.identityHashCode随机数并将其存储在对象标头中。随后的调用Object.hashCode或System.identityHashCode仅从标头中提取此值。默认情况下,它与对象内容或对象位置没有共同点,只有随机数。此行为由-XX:hashCode=nHotSpot JVM选项控制,该选项具有以下可能的值:
Object.hashCode
System.identityHashCode
-XX:hashCode=n
1
请注意,即使你设置了-XX:hashCode=4,hashCode也不会始终指向对象地址。对象可能会在以后移动,但是hashCode将保持不变。此外,对象地址分布不均(如果你的应用程序使用的内存不多,大多数对象将位于彼此附近),因此如果使用此选项,则最终可能会导致哈希表不平衡。
-XX:hashCode=4