加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 05:38:23 所属栏目:Java 来源:网络整理
导读:当我正在学习 java时,我已经知道,比较2个字符串的正确方法是使用equals而不是“==”.这一行 static String s1 = "a";static String s2 = "a";System.out.println(s1 == s2); 将输出true,因为jvm似乎优化了这个代码,以便它们实际上指向同一个地址.我试图证明
当我正在学习 java时,我已经知道,比较2个字符串的正确方法是使用equals而不是“==”.这一行
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);
    }
}

解决方法

你没有丢失任何东西不安全的图书馆正在报告实际发生的情况.

字节码:

static {};
  Code:
   0:   ldc #11; //String a
   2:   putstatic   #13; //Field s1:Ljava/lang/String;
   5:   ldc #11; //String a
   7:   putstatic   #15; //Field s2:Ljava/lang/String;
   10:  return

注意,这两个字符串都放在内存中的不同位置,13和15.

这些变量存储在内存中,哪个需要一个单独的地址,以及一个新的对象是否放在堆上是有区别的.在这种情况下,它会为两个变量分配两个单独的地址,但它不需要创建一个新的String对象,因为它识别同一个String文字.所以这两个变量都引用同一个字符串.

如果你想得到地址,你可以使用这个问题How can I get the memory location of a object in java?中的答案.确保您在使用前阅读注意事项,但我做了一个快速测试,似乎工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读