我在Kathy Sierra的书中读到,当我们使用像String这样的新运算符创建String时s = new String(“abc”)在这种情况下,因为我们使用new关键字,Java将在正常情况下创建一个新的String对象(非池) )内存,s将引用它。此外,文字“abc”将被放置在池中。
intern()表示如果String池已包含字符串,则返回池中的字符串。否则,将String对象添加到池中,并返回对此String对象的引用。
如果使用new创建的字符串“abc”也将字符串放在池中,那么如果字符串池包含字符串,则intern()表示返回池中的字符串,否则将字符串对象添加到池中。
另外我想知道我们是否使用new创建一个String,然后实际创建了多少个对象?
答案 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}}