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

字符串实习生()行为

柴高岑
2023-03-14

来自String类的intern方法的javaDocs:

调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。

考虑以下用例:

    String first = "Hello";
    String second = "Hello";

    System.out.println(first == second);

    String third = new String("Hello");
    String fourth = new String("Hello");

    System.out.println(third == fourth);

    System.out.println(third == fourth.intern());
    System.out.println(third.intern() == fourth);
    System.out.println(third == fourth);

    System.out.println(third.intern() == fourth.intern());
    System.out.println(third.intern() == first);

    String fifth = new String(new char[]{'H','e','l', 'l', 'o'});
    String sixth = new String(new char[]{'H','e','l', 'l', 'o'});

    System.out.println(fifth == fifth.intern());
    System.out.println(sixth == sixth.intern());

    String seven = new String(new char[]{'H','e','l', 'l', 'o' , '2'});
    String eight = new String(new char[]{'H','e','l', 'l', 'o' , '2'});

    System.out.println(seven == seven.intern());
    System.out.println(eight == eight.intern());

有人能解释为什么七==seven.intern()为真而以下为假吗:

  • <代码>系统。出来println(fifth==第五个.intern())
  • <代码>系统。出来println(sixth==第六个.intern())
  • <代码>系统。出来println(八==八。intern())

共有3个答案

纪晨
2023-03-14

Pczeus是正确的。更多信息:

第五个是包含值“Hello”的新字符串(未选中池)。当您intern()它时,返回值是第四个(第一次出现“Hello”被interned),它不等于第五个。

第六个也是同样的答案。

“七”是“Hello2”的第一次出现,在你叫“七==七”之前,它不会被拘留。intern()'。因为它在那一刻被插入,所以intern()的返回值是7。

八是“Hello2”的另一个新实例。当它被实习时,返回值是7,而不是8

曾嘉荣
2023-03-14

因为当您使用new String()语法时,您并没有利用字符串池,而是创建了一个新的字符串实例,而不管它是否在池中。

故事的寓意。。切勿使用新字符串()

您将任由JVM摆布,JVM可以选择是否已经存在“内部化”字符串,或者是否应该内部化。更具体地说:

为了派生字符串文字,Java虚拟机将检查常量\u string\u info结构所给出的代码点序列。

如果方法字符串。以前曾在类字符串的实例上调用intern,该实例包含一系列Unicode代码点,这些代码点与CONSTANT\u String\u info结构给出的代码点相同,那么字符串文字派生的结果就是对该类字符串实例的引用。否则,将创建一个新的类String实例,其中包含由CONSTANT\u String\u info结构给定的Unicode代码点序列;对该类实例的引用是字符串文字派生的结果。最后,调用新字符串实例的intern方法。

太叔正文
2023-03-14

七是您第一次使用字符串“hello2”。因此实习生所做的就是将您的字符串插入池中(并返回它)。那里等于你的七。

当您使用八时,字符串已经在池中(通过在之前运行seven.intern(),因此当您使用八时==八)。intern()您将在等式的左侧得到新创建的八个字符串,在右侧得到由池中的七个创建的字符串,这两个字符串不同

 类似资料:
  • 问题内容: 以下两段代码是否相同? 问题答案: 它们具有相同的 最终结果 ,但它们并不相同(它们将产生不同的字节码;版本实际上经过了这些步骤,生成了新的字符串对象,然后对其进行中间化)。 来自以下两个相关引号: 调用该方法时,如果池中已经包含与该方法确定的对象相等的字符串,则返回池中的字符串。否则,将此对象添加到池中,并返回对该对象的引用。 所有文字字符串和字符串值常量表达式都将被插入。 因此,

  • 问题内容: 为什么Python仅内置字符串?应该可以扩展到可哈希和可比较的类,对吗? 问题答案: 内联事物的目的是能够通过比较它们的内存地址来进行比较。您要确保永远不要创建两个具有相同值的对象(当程序请求创建一个与现有对象具有相同值的第二个对象时,它会收到对先前存在的对象的引用)。这要求你要实习的东西是 不变的 ; 如果一个被拘禁对象的值可以改变,那么按地址比较它们是行不通的。 在Python中,

  • 我试图理解String#intern方法。现在,这引起了更多的混乱。 上面的代码打印为true。如果我注释第3行并取消注释第5行,则打印为false 对于第3行,将检查SCP,并将字符串添加到SCP中。但在这种情况下,s2如何等于s4呢 s2仍在引用堆中指向SCP常量的对象。正当 有人能解释一下发生了什么吗?我已经经历了不同的SO问题,但仍然无法理解。 EDIT 我只是想了解实习生方法。我知道b/

  • 问题内容: 管这个问题在实际中没有任何实际用途,但我对Python如何进行字符串实习感到好奇。我注意到以下内容。 这是我所期望的。 您也可以这样做。 那真是太聪明了! 但是你不能这样做。 Python为什么不评估,并意识到它s1与指向相同的地址相同?最后一个块到底在做什么False呢? 问题答案: 这是特定于实现的,但是你的解释器可能是内部编译时常量,而不是运行时表达式的结果。 接下来,我使用CP

  • 我最近了解了Java字符串池,有几件事我不太明白。 使用赋值操作符时,如果字符串池中不存在新字符串,则将在字符串池中创建新字符串。 当使用String构造函数时,我明白无论String池的状态如何,都将在堆中、String池之外创建一个新字符串。 我在某处读到过,即使在使用构造函数时,也在使用字符串池。它将把字符串插入到字符串池和堆中。 我没有找到任何关于这方面的进一步信息,但我想知道这是不是真的

  • 我读了这篇文章,当我们应该在字符串常量上使用字符串的实习生方法时,但仍然不太清楚String==也与intern()进行比较。我有几个例子。有人能帮我更好地理解这一点吗?