jav*_*eek 63 java object hashcode
如果没有覆盖hashCode()方法,那么在Java中的任何对象上调用hashCode()的结果是什么?
Tag*_*eev 54
在HotSpot JVM中默认情况下首次调用非重载Object.hashCode或System.identityHashCode生成一个随机数并存储在对象头中.随后调用Object.hashCode或System.identityHashCode仅从标头中提取此值.默认情况下,它与对象内容或对象位置没有任何共同之处,只是随机数.此行为由-XX:hashCode=nHotSpot JVM选项控制,该选项具有以下可能的值:
1(用于测试/调试目的)请注意,即使您设置-XX:hashCode=4,hashCode也不会始终指向对象地址.可以稍后移动对象,但hashCode将保持不变.此外,对象地址的分布也很差(如果您的应用程序使用的内存不多,大多数对象将彼此靠近),因此如果使用此选项,最终可能会出现不平衡的哈希表.
Asa*_*aph 13
实施hashCode()可能因类不同而不同,但合同hashCode()非常具体,并在Javadocs中明确和明确地说明:
返回对象的哈希码值.支持此方法是为了哈希表的好处,例如java.util.Hashtable提供的哈希表.
hashCode的一般契约是:
- 每当在执行Java应用程序期间多次在同一对象上调用它时,hashCode方法必须始终返回相同的整数,前提是不修改对象上的equals比较中使用的信息.从应用程序的一次执行到同一应用程序的另一次执行,该整数不需要保持一致.
- 如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
- 如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果.但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能.
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.)
hashCode()紧密相关equals(),如果你覆盖equals(),你也应该覆盖hashCode().
| 归档时间: |
|
| 查看次数: |
15057 次 |
| 最近记录: |