在Javadoc for Object.hashCode()中声明
尽管合理实用,但是由class定义的hashCode方法
Object确实为不同的对象返回了不同的整数.(这通常通过将对象的内部地址转换为整数来实现,但Java™编程语言不需要此实现技术.)
这是一个常见的miconception,这与内存地址有关,但它并没有因为它可以在没有通知的情况下改变,而hashCode()不会,也不能改变对象.
@Neet提供了一个很好的答案的链接/sf/answers/39579151/但我正在寻找更多细节.
这是一个例子来说明我的担忧
Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setAccessible(true);
Unsafe unsafe = (Unsafe) theUnsafe.get(null);
for (int t = 0; t < 10; t++) {
System.gc();
Object[] objects = new Object[10];
for (int i = 0; i < objects.length; i++)
objects[i] = new Object();
for (int i = 0; i < objects.length; i++) {
if (i > 0) System.out.print(", ");
int location = unsafe.getInt(objects, Unsafe.ARRAY_OBJECT_BASE_OFFSET + Unsafe.ARRAY_OBJECT_INDEX_SCALE * i);
System.out.printf("%08x: hc= …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.