问题1:
在这段代码中,是否只创建了一个字符串对象,或者一个字符串对象以及5个字符串文字("abc"
,"xyz"
,"abcxyz"
,"123"
,"abcxyz123"
)?
StringBuilder s1 = new StringBuilder("abc"+"xyz"+"123");
问题2:
在另一种情况下,是否只创建了一个字符串对象?
StringBuilder s2 = new StringBuilder();
s2.append("abc");
s2.append("xyz");
s2.append("123");
答案 0 :(得分:0)
由于字符串是不可变的,当您使用带有两个字符串的+
运算符时,可以使用串联创建一个新的字符串对象。 string pool用作优化,因此如果它包含字符串,则返回引用而不是创建新引用。
intern()
方法将String对象添加到池中(如果它尚未包含它)。 字符串文字总是实习,因此在这两个问题中,您创建相同数量的引用并将它们添加到字符串池(在构造函数中使用或作为参数)。
请注意,创建字符串对象会有所不同:当我们使用s = new String("foo");
时,我们正在创建一个新引用,因此在这种情况下,字符串对象将不会在字符串池中,直到您调用{{ 1}}。