2

以下代码将在字符串常量池和堆中创建多少对象:

String s1 = "Stack";  
String s2 = s1 + " Overflow";

据我所知,所有文字都是在字符串常量池中创建的,但是字符串 concat 运算符在内部使用 StringBuffer 来附加字符串,所以也会在堆中创建一个对象吗?

4

2 回答 2

0

在字符串常量池中将创建两个对象。由于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
于 2017-11-08T07:37:50.850 回答
0
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.

于 2017-11-08T13:25:00.163 回答