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

使用new创建字符串对象及其与intern方法的比较

宋耀
2023-03-14

我在Kathy Sierra的书中读到,当我们使用new操作符创建String时,比如String s=new String(“abc”),因为我们使用了new关键字,Java将在普通(非池)内存中创建一个新的String对象,s将引用它。此外,字面上的“ABC”将被放置在池中。

intern()表示,如果String pool已经包含一个字符串,则返回池中的字符串;否则,将String对象添加到池中,并返回对该String对象的引用。

如果使用new创建的字符串“abc”也将字符串放置在池中,那么wht doo intern()表示,如果字符串池包含字符串,则返回池中的字符串,否则字符串对象将添加到池中。

共有1个答案

邹涵畅
2023-03-14

如果您真的需要执行新字符串(“abc”),您会知道需要执行,也会知道为什么。这是如此罕见,几乎可以说你永远不需要。只需使用“abc”

长版本:

当您有代码新字符串(“abc”)时,以下情况会在不同的时间发生:

    null
String s1 = "abc";               // Get a reference to the string defined by the literal
String s2 = s1.intern();         // No-op
System.out.println(s1 == s2);    // "true"
System.out.println(s1 == "abc"); // "true", all literals are interned automatically

您至少创建一个string对象(新的、非interned的对象),也可能创建两个(如果文本还没有在池中;但同样,当类文件的文本被加载时,这一位发生在前面):

String s1 = "abc";            // Get a reference to the string defined by the literal
String s2 = new String(s1);   // Create a new `String` object (guaranteed)
System.out.println(s1 == s2); // "false"
String s3 = s2.intern();      // Get the interned version of the string with these characters
System.out.println(s1 == s3); // "true"
 类似资料:
  • 问题内容: 我在Kathy Sierra的书中读到,当我们使用诸如String s = new String(“ abc”)之类的新运算符创建String时,在这种情况下,由于我们使用了new关键字,Java会在普通(非池)内存中创建一个新的String对象,和s将引用它。此外,文字“ abc”将放置在池中。 intern()表示,如果String池中已经包含一个字符串,则返回池中的字符串,否则,

  • 我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“

  • 我想出了场景&不能理解背后的逻辑?我只听懂了第一个,其余两个听不懂?请解释一下它在内部是如何工作的?

  • 问题内容: 如何使用下面的代码解组XML字符串并将其映射到下面的JAXB对象? 问题答案: 要传递XML内容,您需要将内容包装在中,然后将其解组:

  • 我想使用字符串创建一个JSON对象。 示例:JSON 为了创建上面的JSON,我使用了这个。 我想知道如何创建一个包含JSON数组的JSON。 下面是示例JSON。 多谢了。

  • 可能重复: 基于参数的真实类型选择重载方法 当参数为文字空值时,如何选择重载方法? 当我执行下面的代码时,我得到以下输出: 名为“”的字符串参数为“”的方法。。。" 为什么?