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

时间:2012-05-13 10:55:02

标签: java string

我在Kathy Sierra的书中读到,当我们使用像String这样的新运算符创建String时s = new String(“abc”)在这种情况下,因为我们使用new关键字,Java将在正常情况下创建一个新的String对象(非池) )内存,s将引用它。此外,文字“abc”将被放置在池中。

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

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

另外我想知道我们是否使用new创建一个String,然后实际创建了多少个对象?

2 个答案:

答案 0 :(得分:6)

TL; DR :如果你真的需要做new String("abc"),你就会知道自己需要,而且你会知道原因。它是如此罕见,以至于几乎有效地说你永远不需要。只需使用"abc"


长版:

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

  • 当加载包含该代码的类时,如果一个字符为"abc"的字符串不在实习池中,则会创建并放在那里。
  • 运行new String("abc")代码时:
    • 对实习池中的"abc"字符串的引用将传递到String构造函数。
    • 通过复制传递给构造函数的String中的字符来创建和初始化 new String对象。
    • 新的String对象将返回给您。
  

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

因为那是intern所做的。请注意,在字符串文字上调用intern是一个无操作;字符串文字全部自动实现。 E.g:

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对象(新的,非实习的对象),可能还有两个(如果文字不在池中;但是再次,那个位发生得更早,当班级文件的文字已加载):

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"

答案 1 :(得分:0)

String Pool是一个字符串引用池。对象仅在堆中创建。

使用new String("abc").intern()或使用String s = "abc"等方法时;如果存在引用" abc"的引用,则检查字符串池。

如果参考" abc"池中已存在.intern(),并且引用String object引用new String("abc")时引用new String("abc")public static void main(String[] args) { String s = new String("abc"); String a = s; System.out.println(s==a);// true String b = "abc"; s = s.intern(); System.out.println(s==a);// false } 创建的对象有资格进行垃圾回收。请参阅以下代码以获得更清晰的信息。

{{1}}