我在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’。因此
我使用以下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是带有本地时区格式的时间戳(
问题内容: 我正在用Java制作轮盘赌(我自己的版本),而玩家可以打赌的类型之一就是选择将要滚动的颜色。(偶数是黑色,奇数是红色)。有没有一种方法可以使用switch语句将字符串与枚举进行比较? 这就是我想要得到的,但这并不是让我在switch语句中使用枚举“颜色”。 问题答案: 您必须具有要在其上进行切换的枚举类型的实例(其 成员 )。您正在尝试打开Enum类本身,这是没有意义的构造。所以你可能