以下代码将在字符串常量池和堆中创建多少对象:
String s1 = "Stack";
String s2 = s1 + " Overflow";
据我所知,所有文字都是在字符串常量池中创建的,但是字符串 concat 运算符在内部使用 StringBuffer 来附加字符串,所以也会在堆中创建一个对象吗?
以下代码将在字符串常量池和堆中创建多少对象:
String s1 = "Stack";
String s2 = s1 + " Overflow";
据我所知,所有文字都是在字符串常量池中创建的,但是字符串 concat 运算符在内部使用 StringBuffer 来附加字符串,所以也会在堆中创建一个对象吗?
在字符串常量池中将创建两个对象。由于String s2 = s1 + " Overflow";
在编译时,编译器会附加这两个字符串,并且在字符串常量池中只会创建一个对象,而另一个对象是s1
.
package testPackage;
class Test {
public static void main(String[] args) {
String s1 = "Stack";
String s2 = s1 + " Overflow";
System.out.println(s1 == "Stack");
System.out.println(s1 == s2);
System.out.println(s2 == "Stack Overflow");
}
}
产生输出:
true
false
false
String s1 = "Stack";
"Stack"
将在字符串常量池中。
String s2 = s1 + " Overflow";
内部+ operator
用于StringBuilder
连接字符串。
所以内部实现 String s2 = s1 + " Overflow";
将是
String str = new StringBuilder(s1).append("Overflow").toString();
因为它是new StringBuilder(str)
这样,所以StringBuilder
对象将在the Heap
. 让我们看看StringBuilder(String str)
构造函数
public StringBuilder(String str) {
super(str.length() + 16);
append(str);
}
和super(int capacity)
构造函数
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
在这里我们可以看到StringBuilder(String str)
构造函数只是创建了一个char[] array
并调用了append(String str)
方法。
如果我们查看append(String str)
方法的实现,StringBuilder
我们可以看到该append(String str)
方法只是在玩 achar[] array
并且它没有创建任何新的对象或数组。
public StringBuilder append(String str) {
super.append(str);
return this;
}
和实施super.append(String str)
是
public AbstractStringBuilder append(String str) {
if (str == null) str = "null";
int len = str.length();
ensureCapacityInternal(count + len);
str.getChars(0, len, value, count);
count += len;
return this;
}
最后让我们看一下toString()
方法StringBuilder
类。
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
的toString()
方法StringBuilder
返回一个new String
肯定会在的,Heap
因为它是用new String(...)
;创建的
上面的解释说The StringBuilder will only create a new string when toString() is called on it. Until then, it maintains an char[] array of all the elements added to it.
So, the conclusion is "Stack" will be in the String Constant pool and s1 + " Overflow" i.e Stack overflow will be in the Heap.