gpt4 book ai didi

java - String s1 == String s2 (true) 但 FieldOffset 不同

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:17 24 4
gpt4 key购买 nike

在学习 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com