- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在学习 Java 时,我了解到比较 2 个字符串的正确方法是使用等号而不是“==”。这条线
static String s1 = "a";static String s2 = "a";System.out.println(s1 == s2);
将输出 true,因为 jvm 似乎已经优化了这段代码,因此它们实际上指向相同的地址。我试图用我在这里找到的一篇很棒的帖子来证明这一点
http://javapapers.com/core-java/address-of-a-java-object/
但是地址好像不一样。我错过了什么?
import sun.misc.Unsafe;import java.lang.reflect.Field;public class SomeClass { static String s1 = "a"; static String s2 = "a"; public static void main (String args[]) throws Exception { System.out.println(s1 == s2); //true Unsafe unsafe = getUnsafeInstance(); Field s1Field = SomeClass.class.getDeclaredField("s1"); System.out.println(unsafe.staticFieldOffset(s1Field)); //600 Field s2Field = SomeClass.class.getDeclaredField("s2"); System.out.println(unsafe.staticFieldOffset(s2Field)); //604 } private static Unsafe getUnsafeInstance() throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException { Field theUnsafeInstance = Unsafe.class.getDeclaredField("theUnsafe"); theUnsafeInstance.setAccessible(true); return (Unsafe) theUnsafeInstance.get(Unsafe.class); }}
最佳答案
我认为您对 staticFieldOffset
返回的内容感到困惑。它将 指针 的偏移量返回到 String
实例,而不是 String
本身的地址。因为有两个字段,所以它们有不同的偏移量:即两个指针,它们恰好具有相同的值。
细读 Unsafe javadoc显示这个:
Report the location of a given field in the storage allocation of its class. Do not expect to perform any sort of arithmetic on this offset; it is just a cookie which is passed to the unsafe heap memory accessors.
换句话说,如果您知道实际的 Class
实例在内存中的位置,那么您可以将此方法返回的偏移量添加到该基地址,结果将是内存中的位置您可以在其中找到指向 String
的指针的值。
关于java - String s1 == String s2 (true) 但 FieldOffset 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16859969/
我试图理解显式结构布局和结构覆盖,但我没有看到预期的行为。给定以下代码: class Program { static void Main(string[] args) {
我是 stackoverflow 的新手,我对 C# 结构及其布局有疑问。 让我们假设以下结构: [StructLayout(LayoutKind.Sequential, Pack = 1)] pub
我在对数组正确使用 FieldOffset 时遇到了一些问题。下面的代码是一个示例,它对我来说无法正常工作: [StructLayout(LayoutKind.Explicit)] public st
考虑我需要确保以非常特定的方式将类/结构映射到内存的情况,可能是由于需要匹配外部协议(protocol): [StructLayout(LayoutKind.Sequential, Pack=1)]
我知道为了在 C# 中表示联合,我需要使用 StructLayout[LayoutKind.Explicit)] 和 [FieldOffset(x)] 属性来指定联合内的字节偏移量。但是,我有一个我想
在学习 Java 时,我了解到比较 2 个字符串的正确方法是使用等号而不是“==”。这条线 static String s1 = "a";static String s2 = "a";System.o
我是一名优秀的程序员,十分优秀!