当前位置: 首页 > 知识库问答 >
问题:

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

相洛华
2023-03-14
static String s1 = "a";
static String s2 = "a";
System.out.println(s1 == s2);  

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);
    }
}

共有1个答案

易招
2023-03-14

你没有错过任何东西。不安全库正在报告实际发生的情况。

字节码:

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文字。因此这两个变量都引用了相同的字符串。

 类似资料:
  • 我检查了我的php.ini(我正在运行CentOS): 我在一个论坛上读到我必须安装SendMail。所以我安装了它。现在带有mail()函数的站点不再加载了。所以我删除了sendmail,mail()函数再次返回true,但不发送邮件。 你知道吗?

  • 问题内容: 我的交互式控制台的简要记录: 到底为什么呢? 编辑: 为了对比起见,请考虑运算符。 这使得有很大的意义,因为虽然和都意味着同样的事,作为一个条件语句,他们真的是不一样的东西。 再次编辑: 更有趣的后果: 问题答案: 因为Python中的Boolean是整数的子类型。从文档中: 布尔值是两个常量对象False和True。它们用于表示真值(尽管其他值也可以视为假或真)。在数字上下文中(例如

  • 我刚刚开始学习Javascript,现在只是学习一些基本的东西。但问题是我真的不明白如果这个switch语句如何返回 null null 还有人看到问题了吗? 如有任何帮助,我们将不胜感激!

  • 问题内容: 当我尝试从Java代码中删除tomcat服务器conf / Catalina / localhost中存在的文件时,file.delete()始终返回false。但是,如果我通过file.exists()函数检查文件,它将返回true。我没有任何例外。请帮助我们为什么会这样。有什么解决方案? 问题答案: 当我尝试从Java代码中删除tomcat服务器conf / Catalina /

  • 问题内容: 我是AngularJS的新手,所以对于我的问题可能有一个简单的解决方案。我一直在处理这种形式。我有两个输入- 一个用于门的数量,一个用于窗户的数量。然后,我要显示几个div,如果它们满足一定数量的门窗总数。当我在输入中输入数字时,ng-show解析为“ true”。但是该元素上仍然具有“ ng-hide”类,因此仍将其隐藏。 这是我的代码示例: 这是我输入3门和4窗口时的输出: 问题答

  • 这似乎是一个简单的解决方案,但似乎设置 似乎还设置了物品从底部堆叠 我试图将设置为false,但这并没有做任何事情,什么是颠倒项目顺序但仍从顶部填充的最佳方法?我应该改用自定义比较器类吗?我希望这比创建另一个类更容易。