如何做Object.hashCode()和System.identityHashCode()工作在后端?是否identityHashCode()返回对象的引用?是否hashCode()取决于?对象?==运算符如何在后端工作.
hashCode()和之间有什么区别identityHashCode()?
如果我们查看Java Object类,那么我们可以找到一些方法,如:
public native int hashCode()
protected native Object clone()
Run Code Online (Sandbox Code Playgroud)
这些本地人是什么?这些方法如何运作?
我正在尝试理解该hashCode()方法的本机实现.这种方法到底是什么回归?它是一个内存地址还是一个随机值?
如果在HotSpot Java 7 64位版本上运行以下命令.
int countTopBit = 0, countLowestBit = 0;
for (int i = 0; i < 100000000; i++) {
int h = new Object().hashCode();
if (h < 0)
countTopBit++;
if ((h & 1) == 1)
countLowestBit++;
}
System.out.println("The count of negative hashCodes was " + countTopBit + ", the count of odd hashCodes was " + countLowestBit);
Run Code Online (Sandbox Code Playgroud)
你可以得到像这样的结果
The count of negative hashCodes was 0, the count of odd hashCodes was 49994232
Run Code Online (Sandbox Code Playgroud)
我想知道这是否意味着Object.hashCode()它只是真正的31位,为什么会这样呢?
不是不使用顶部位的情况.来自HashMap的源代码
257 /** …Run Code Online (Sandbox Code Playgroud) 我正在尝试一些围绕java中的对象相等的代码.正如我在某处读过的那样
hashCode()是通过应用散列函数生成的数字.散列函数对于每个对象可以是不同的,但也可以是相同的.在对象级别,它返回对象的内存地址.
现在,我有一个示例程序,我连续运行了10次.每次运行程序时,我都会获得与哈希码相同的值.
如果hashCode()函数返回对象的内存位置,那么java(JVM)如何在连续运行中将对象存储在相同的内存地址?
你能否就这个问题给我一些见解和看法?
我正在运行以测试此行为的程序如下:
public class EqualityIndex {
private int index;
public EqualityIndex(int initialIndex) {
this.index = initialIndex;
}
public static void main(String[] args) {
EqualityIndex ei = new EqualityIndex(2);
System.out.println(ei.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
每次运行此程序时,返回的哈希码值都是4072869.
该toString方法的Object独特之处在于它似乎是Java中唯一可以查看内存地址的地方.怎么Object做?
我想知道,以便我可以在我自己的课程中模仿它的实现.我无法使用,super.toString()因为我正在扩展一个toString已经覆盖的类.
更新:我的问题的前提是要求内存地址,但答案表明这个前提是不正确的,所以我实际上问的是:如何Object.toString()返回它的作用,我怎样才能模仿它?
hashCode()是如何实现的?
我的假设是它使用对象内存位置作为运行哈希函数的初始数(种子).然而,这种情况并非如此.
我也看过Hash:它在内部如何运作?但它没有回答我的问题.
是的我可以下载SDK,但在我这样做并查看代码之前,也许其他人已经了解它.
谢谢 :)
编辑: 我知道它应该被覆盖等等,所以请尽量保持主题:)
我在同一台机器上连续运行这个程序:
class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.hashCode());
}
}
Run Code Online (Sandbox Code Playgroud)
每次在我的机器上运行程序(Windows 7 64位)时结果都是一样的:4384790
在另一台机器上(Windows server 2008,64位),大多数时候它给了我:1671711.但有时候结果是:11394033.
在我的机器上,我在Java HotSpot(TM)Client VM 1.6.0_26/1.6.0_33下运行该程序
我已经阅读了Object类的文档:
尽可能合理,Object类定义的hashCode方法确实为不同的对象返回不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术.)
但是如果确实通过将对象的内部地址转换为整数来实现hashCode(),我仍然不明白为什么每次运行它时Java VM都为Test对象分配相同的地址.
是否确切知道默认的hashCode()如何运作?
我不是在讨论String类或任何其他重写hashcode的类.假设我只是创建了一个Object类的新对象,那么hashcode()无论如何都会identityHashCode(Object x)返回true,返回该对象的内存地址?