当前位置: 首页 > 面试题库 >

使用new创建字符串对象并将其与intern方法进行比较

任飞鸣
2023-03-14
问题内容

我在Kathy Sierra的书中读到,当我们使用诸如String s = new String(“
abc”)之类的新运算符创建String时,在这种情况下,由于我们使用了new关键字,Java会在普通(非池)内存中创建一个新的String对象,和s将引用它。此外,文字“
abc”将放置在池中。

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

如果使用new创建的字符串“ abc”也将字符串放置在池中,则int()会说如果String
pool包含字符串,则从池中返回字符串,否则将字符串对象添加到池中。

我也想知道我们是否使用new创建了一个String,那么实际上创建了多少个对象?


问题答案:

TL; DR :如果您确实需要做new String("abc"),您将知道自己需要,并且会知道为什么。这种情况非常罕见, 几乎
可以说您不需要。只需使用"abc"

长版:

当您拥有代码时new String("abc"),以下情况会在不同时间发生:

  • 加载包含该代码的类时,如果内部存储"abc"池中尚未包含带有字符的字符串,则会将其创建并放在其中。
  • new String("abc")代码运行:
    • "abc"来自内部缓冲池的字符串的引用将传递到String构造函数中。
    • 通过将传递过来的字符复制到构造函数中,可以创建并初始化一个 String对象String
    • String对象将返回给您。

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

因为那是什么intern。请注意,调用intern字符串文字是禁止操作的;字符串文字都将被自动嵌入。例如:

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

我也想知道我们是否使用new创建了一个String,那么实际上创建了多少个对象?

您至少创建一个String对象(新的,非intern的对象),并可能创建两个对象(如果文字尚未在池中;但是同样,在加载类文件的文字时,这会更早发生):

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的书中读到,当我们使用new操作符创建String时,比如String s=new String(“abc”),因为我们使用了new关键字,Java将在普通(非池)内存中创建一个新的String对象,s将引用它。此外,字面上的“ABC”将被放置在池中。 intern()表示,如果String pool已经包含一个字符串,则返回池中的字符串;否则,将String对象添加到

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

  • 问题内容: 这个问题已经在这里有了答案 : Python If == true语句仅在readline的最后一行有效 (1个答案) 2年前关闭。 我试图将我的一行与一个字符串进行比较,但是这行不通。我正在读取一个html文件,我需要解析该文件以将该部分发送到字典,但是当我使用if将行之一与字符串进行比较时,匹配时不会返回True。 这是代码: 问题答案: 我认为这是因为它尝试读取字符串中的换行符:

  • 问题内容: 从String类的javaDocs的intern方法中: 调用intern方法时,如果池已经包含等于equals(Object)方法确定的此String对象的字符串,则返回池中的字符串。否则,将此String对象添加到池中,并返回对此String对象的引用。 考虑以下用例: 有人可以解释为什么 是 正确的, 而以下是 错误的 : 问题答案: 七是您第一次使用字符串’hello2’。因此

  • 我创建了一个,当调用变量为ISE时,它会读取相关数据的表。但是,如果我尝试将与另一个对象进行比较,无法正确读取。我想告诉脚本,如果现有CSV中的任何行与匹配,则不会将数据导出到CSV,换句话说,跳过CSV文件中的重复行。CSV可能有也可能没有多行。

  • 我使用以下sql将字符串与日期oracle进行比较,但得到的结果不正确。我尝试了to\u date、to\u char选项,但没有得到任何正确的结果。 地点日期1:10-JUN-2101.00.00.000000000 AM日期2:10-JUN-2021 01:00 上述sql返回上述Date1和Date2的行,尽管它们相等。Date1也是varchar格式,Date2是带有本地时区格式的时间戳(