java new运算符和hashcode()

sam*_*ara 3 java hashcode new-operator

首先,我在这里谈论默认的hashCode()方法而不是覆盖的东西.当我们创建一个新对象时,'new'运算符返回它创建的对象的内存地址; 在java中我们说它更普遍地返回引用.我想知道的是,这是否与hashCode()返回的值相同?

我相信他们是一样的.但话说回来,当我们有超过2 ^ 32个对象并且给定hashCode()返回一个整数(2 ^ 32个不同的数字)时,将会发生全部碰撞,当我们传递对象时,这将是一个真正的混乱.JVM如何处理?

Jon*_*eet 5

当我们创建一个新对象时,'new'运算符返回它创建的对象的内存地址; 在java中我们说它更普遍地返回引用.

好吧,参考当然不一定是地址.这是一种引用对象的方式 - 位的确切值取决于JVM实现.

我想知道的是,这是否与hashCode()返回的值相同?

不必要.你当然不应该试图在这方面作出任何假设.再次,它是一个实现细节.

值得记住的是,虽然垃圾收集器可以在内存中移动对象(随着更新引用),但哈希代码不能基于此更改,这是针对您的建议的参数.

但话说回来,当我们有超过2 ^ 32个对象并且给定hashCode()返回一个整数(2 ^ 32个不同的数字)时,将会发生全部碰撞,当我们传递对象时,这将是一个真正的混乱.

会有哈希码冲突,是的.这是不可避免的 - 任何使用哈希码的东西都需要考虑碰撞的可能性.虽然不存在引用冲突 - 一个能够同时支持超过2 32个值的JVM,但不能使哈希码和引用具有相同的值.