当有比"int"更多的对象可以容纳时,identity-hashcode会发生什么?

jav*_*top 2 java memory jvm hashcode

这种方法System.identityHashCode(...)被调用,因为它识别对象,因此两个不同的对象不能具有相同的身份 - 哈希码,对吧?

它返回一个int.但是当对象数量超过整数范围时,在具有大量RAM的系统上会发生什么2^32

那岂不是一个问题,HashMapS和HashSet其上没有覆盖类的工作时小号equalshashCode

编辑:
如果int还不够,我可以为对象获得一些真正的唯一ID吗?

Jon*_*eet 7

不,它只是一个正常的哈希冲突.允许两个不相等的对象返回相同的哈希值 - 只是那时它们都需要进行相等性的比较.

这不仅限于身份哈希码 - 请考虑String.hashCode().显然,有更多可能的字符串而不是int值,因此必须至少有一个散列值,这是散列多个字符串的结果.A HashMap/ HashSet将首先使用哈希码快速将可能匹配集缩小到仅具有相同哈希码的那些条目,然后依次调用equals()每个条目直到找到匹配或确定没有条目相等到给定的密钥.

  • @Jonik:我认为这是相当清楚的.它基本上是在说,"如果你能够为这个对象做一个非虚拟的`Object.hashCode()`调用,它会返回什么?" (2认同)