Java 将在字符串常量池和堆中创建多少个对象

Java 将在字符串常量池和堆中创建多少个对象,java,string,object,heap,Java,String,Object,Heap,将在字符串常量池和堆中为以下代码创建多少对象: String s1 = "Stack"; String s2 = s1 + " Overflow"; 据我所知,所有文本都是在字符串常量池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,因此也会在堆中创建一个对象吗?将在字符串常量池中创建两个对象。As字符串s2=s1+“溢出”在编译时,编译器将附加这两个字符串,在字符串常量池中只创建一个对象,另一个对象是s1 package testPackage; c

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

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

据我所知,所有文本都是在字符串常量池中创建的,但是字符串concat操作符在内部使用StringBuffer来追加字符串,因此也会在堆中创建一个对象吗?

将在字符串常量池中创建两个对象。As
字符串s2=s1+“溢出”在编译时,编译器将附加这两个字符串,在字符串常量池中只创建一个对象,另一个对象是
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 s2 = s1 + " Overflow";
内部
+运算符
使用
StringBuilder
连接字符串

所以内部实现
字符串s2=s1+“溢出”将被删除

String str = new StringBuilder(s1).append("Overflow").toString(); 
这里因为它是
newstringbuilder(str)
,所以
StringBuilder
对象将在堆中创建。让我们看看
StringBuilder(stringstr)
constructor

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
} 
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}
super(int容量)
constructor

public StringBuilder(String str) {
    super(str.length() + 16);
    append(str);
} 
AbstractStringBuilder(int capacity) {
    value = new char[capacity];
}
在这里,我们可以看到
StringBuilder(stringstr)
构造函数只是创建一个
char[]array
并调用
append(stringstr)
方法

如果我们看一下
StringBuilder
append(String str)
方法的实现,我们可以看到
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);
}
StringBuilder
toString()
方法返回一个
新字符串
,它肯定会在
堆中,因为它是用
新字符串(…)
创建的

上面的解释说,
StringBuilder只会在调用toString()时创建一个新字符串。在此之前,它将保留添加到其中的所有元素的char[]数组。


因此,结论是“Stack”将位于字符串常量池中,s1+“Overflow”即堆栈溢出将位于堆中。

由于字符串是不可变的,任何附加到现有字符串的操作都会导致创建一个新字符串,并将以前的值附加到新字符串中。所以最好使用StringBuilder。对于您最初的问题,将创建三个字符串:Stack、Overflow和Stack Overflow。可能是@Saifhamad的重复项。您的建议没有任何意义。@akshaya pandey会在堆中创建任何对象吗?。。因为concat运算符“+”在内部使用StringBuffer来追加字符串。那么文字“溢出”呢?不会在字符串常量池中创建它吗?不会,不会创建。文字“溢出”怎么办?它也将在字符串常量池中创建??它将在StringBuilder的char[]数组中创建。它不会出现在字符串常量池中。