请看下面的图片。当我们使用 new
关键字在 java 中创建对象时,我们从操作系统获取内存地址。
当我们写 out.println(objName)
时,我们可以看到一个“特殊”字符串作为输出。我的问题是:
这个输出是什么?
如果是操作系统给我们的内存地址:
a) 如何将此字符串转换为二进制?
b) 如何获得一个整型变量地址?
原文由 uzay95 发布,翻译遵循 CC BY-SA 4.0 许可协议
请看下面的图片。当我们使用 new
关键字在 java 中创建对象时,我们从操作系统获取内存地址。
当我们写 out.println(objName)
时,我们可以看到一个“特殊”字符串作为输出。我的问题是:
这个输出是什么?
如果是操作系统给我们的内存地址:
a) 如何将此字符串转换为二进制?
b) 如何获得一个整型变量地址?
原文由 uzay95 发布,翻译遵循 CC BY-SA 4.0 许可协议
可以使用 sun.misc.Unsafe
:请参阅@Peter Lawrey 的精彩回答 -> 有没有办法获取参考地址?
将其代码用于 printAddresses() :
public static void printAddresses(String label, Object... objects) {
System.out.print(label + ": 0x");
long last = 0;
int offset = unsafe.arrayBaseOffset(objects.getClass());
int scale = unsafe.arrayIndexScale(objects.getClass());
switch (scale) {
case 4:
long factor = is64bit ? 8 : 1;
final long i1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) * factor;
System.out.print(Long.toHexString(i1));
last = i1;
for (int i = 1; i < objects.length; i++) {
final long i2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) * factor;
if (i2 > last)
System.out.print(", +" + Long.toHexString(i2 - last));
else
System.out.print(", -" + Long.toHexString( last - i2));
last = i2;
}
break;
case 8:
throw new AssertionError("Not supported");
}
System.out.println();
}
我设置了这个测试:
//hashcode
System.out.println("Hashcode : "+myObject.hashCode());
System.out.println("Hashcode : "+System.identityHashCode(myObject));
System.out.println("Hashcode (HEX) : "+Integer.toHexString(myObject.hashCode()));
//toString
System.out.println("toString : "+String.valueOf(myObject));
printAddresses("Address", myObject);
这是输出:
Hashcode : 125665513
Hashcode : 125665513
Hashcode (HEX) : 77d80e9
toString : java.lang.Object@77d80e9
Address: 0x7aae62270
结论 :
原文由 JBE 发布,翻译遵循 CC BY-SA 3.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
那是用“@”字符分隔的类名和 System.identityHashCode() 。身份哈希码表示的内容是特定于实现的。它通常是对象的初始内存地址,但随着时间的推移,对象可能会被 VM 在内存中移动。所以(简单地说)你不能指望它是任何东西。
获取变量的内存地址在 Java 中是没有意义的,因为 JVM 可以自由地实现对象并在它看起来合适的时候移动它们(你的对象可能/将在垃圾收集等期间移动)
Integer.toBinaryString() 会给你一个二进制形式的整数。