将在String Constant Pool和堆中创建多少个对象

时间:2017-11-08 07:08:06

标签: java string object heap

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

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

据我所知,所有文字都是在String Constant池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,所以在Heap中也会创建一个对象吗?

2 个答案:

答案 0 :(得分:0)

将在String Constant Pool中创建两个对象。作为String s2 = s1 + " Overflow";在编译时,编译器将附加这两个字符串,并且只在String Constant Pool中创建一个对象,而其他对象为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

答案 1 :(得分: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)方法只是在玩char[] 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.