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

Java字符串实习生函数结果问题[重复]

林修真
2023-03-14

我现在正在学习Java,我读到了这个问题:什么是Java字符串实习堆栈溢出
但我阅读了其他文章,其中提供了一些我不理解的示例:

    public static void main(String[] args) {
        String str2 = new String("str") + new String("01");
        str2.intern();
        String str1 = "str01";
        System.out.println(str2 == str1);  //true

        String s4 = new String("1");
        s4.intern();
        String s5 = "1";
        System.out.println(s4 == s5);   //false

        String s = new StringBuilder("aa").append("bb").toString();
        String s2 = new StringBuilder("cc").toString();
        System.out.println(s.intern() == s);    //true
        System.out.println(s2.intern() == s2);  //false
    }

Java 11中的结果(在Java 8中应该相同)是:

js prettyprint-override">true
false
true
false

我不知道为什么结果不同,我想这都是真的。有人能解释一下吗?

共有1个答案

贝财
2023-03-14

让我们看看实习生实际做了什么(我的重点):

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

运行此代码时:

str2.intern();

字符串池仅包含str和01<代码>str2是不在字符串池中的“str01”,因此str2引用的对象也被添加到字符串池中。因此,当到达下一行时,由于池中已经存在str01,str1将引用与str2相同的对象。

请注意,str2==str1的原因并不是因为intern以某种方式更改了str2引用的对象。它对str2没有任何作用。字符串毕竟是不可变的。

现在我们可以理解第一个错误了。在该行中:

String s4 = new String("1");

由于字符串文字“1”,因此将“1”添加到字符串池中。请注意,添加到字符串池的对象与s4引用的对象不同。现在调用s4。intern(),它对s4不做任何操作,并返回字符串池中的对象。但您忽略了返回值。这就是为什么s4=s5和s4。intern()=s5。

s2的原因。实习生()!=s2要简单得多,s2所指的对象与字符串池中的“cc”不同<代码>s2。intern()应该返回字符串池中的对象,所以它当然不是同一个对象!

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

  • s1和s3最终调用StringBuilder。toString,方法toString()控制一个新字符串(),然后调用该字符串。intern(),结果不同,这让我很困惑。

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

  • 我有一个字符串a如下 我想用拆分这个字符串。所以我使用了以下代码来拆分它 获得: 需要< code>split.length: 我不明白我做错了什么。无论我使用什么正则表达式,我都得到相同的结果。此外,我无法修改字符串。 谁能帮我把作为数组长度。

  • 来自String类的intern方法的javaDocs: 调用intern方法时,如果池中已经包含一个由equals(Object)方法确定的等于此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中并返回对此String对象的引用。 考虑以下用例: 有人能解释为什么为真而以下为假吗: <代码>系统。出来println(fifth==第五个.intern()) <代码

  • 本文向大家介绍Python3.2中的字符串函数学习总结,包括了Python3.2中的字符串函数学习总结的使用技巧和注意事项,需要的朋友参考一下 Sequence Types sequence类型有六种:strings, byte sequences (bytes objects), byte arrays(bytearray objects), list, tuple, range objects