Java 当“int”所能容纳的对象数超过时,标识哈希代码会发生什么变化?

Java 当“int”所能容纳的对象数超过时,标识哈希代码会发生什么变化?,java,memory,jvm,hashcode,Java,Memory,Jvm,Hashcode,方法System.identityHashCode(…)就是这样调用的,因为它标识对象,所以两个不同的对象不能有相同的标识hashcode,对吗 它返回一个int。但是,在具有大量RAM的系统上,当对象数超过整数范围时会发生什么情况 在不重写等于和哈希代码的类上操作时,HashMap和HashSet会不会有问题 编辑: 如果int还不够,我可以为一个对象获取一些真正的唯一ID吗?不,这只是一个正常的哈希冲突。允许两个不相等的对象返回相同的散列-只是需要比较它们是否相等 这不限于身份哈希代码-考虑

方法
System.identityHashCode(…)
就是这样调用的,因为它标识对象,所以两个不同的对象不能有相同的标识hashcode,对吗

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

在不重写
等于
哈希代码
的类上操作时,
HashMap
HashSet
会不会有问题

编辑:

如果
int
还不够,我可以为一个对象获取一些真正的唯一ID吗?

不,这只是一个正常的哈希冲突。允许两个不相等的对象返回相同的散列-只是需要比较它们是否相等


这不限于身份哈希代码-考虑<代码>字符串.HASCODE()。显然,可能的字符串多于

int
值,因此必须至少有一个哈希值,它是对多个字符串进行哈希运算的结果。
HashMap
/
HashSet
首先使用哈希代码快速缩小可能的匹配集,使其仅限于具有相同哈希代码的条目,然后依次对每个条目调用
equals()
,直到找到匹配项或确定所有条目都不等于给定的键。

错误。任何数量的对象都可以具有相同的标识hashCode。

我可以为对象获取一些真正唯一的ID吗?我会问你如何处理这样的ID?它是否需要在给定的时刻、JVM的整个生命周期内或在任何数量的系统中都是唯一的


您可以为每个需要唯一id的对象生成一个id。但是,重复ID在理论上仍然是可能的,只是可能性很小。

谢谢!是否有一种Java方法可以获取某个对象的真正唯一ID?我的意思是,JVM可以而且必须能够做到这一点,那么为什么开发人员不能呢?@java:我不知道。适当的类型取决于所讨论的JVM,并且当GC在内存中移动ID时,该ID可能会随着时间的推移而改变。@Jonik:假设您想要一个只考虑对象标识而不考虑正常相等性的哈希映射,例如,您想要单独存储单独但相等的字符串。您需要能够测试对象标识-这很容易通过==-但是您还需要能够获得适当的哈希代码。如果没有识别码,你会怎么做?@Jonik:我认为这相当清楚。它基本上是在说,“如果你能够对这个对象进行非虚拟调用,
Object.hashCode()
,它会返回什么?”
~4.2*(10^9)
:我建议在谈论与计算机相关的任何事情时使用simple
2^XXX
(即
2^32
是整数的一个范围)。
@Crozin
好的,已更改。顺便说一下,我有2^0台电脑,2^1台显示器和大约2^5张音频CD;)另外:唯一的保证是两个具有不同识别码的物体不是同一个物体。从根本上说,不太可能:当产生数十万亿个重复ID时,获得1个重复ID的几率相当于一年内被陨石击中的几率(来源:维基百科)对于某些类型的数据结构,具有绝对可排序ID可能很有用。例如,比较引用同一实例的
String
类型的两个变量非常快。比较引用包含相同5000个字符的不同实例的两个变量很慢。如果可以识别哪个字符串是“较旧的”,并将对较新实例的引用替换为对较旧实例的引用,那么将多个字符串相互比较的行为将导致合并匹配的字符串。