你认为 String str = “a” + “b”;
这是创建了几个对象呢?就是只创建了一个对象
String常量的累加操作中,编译器会进行优化,如果是 String str = “a” + “b”,那相当于String str = “ab”; ,常量池中会创建一个ab的对象。
//----------------------------------------------
new String(“a”) + new String(“b”)呢?
public class StringNewTest {
public static void main(String[] args) {
String str = new String("a") + new String("b");
}
}
/**
* 思考:
*
* 对象1:new StringBuilder()
* 对象2: new String("a")
* 对象3: 常量池中的"a"
* 对象4: new String("b")
* 对象5: 常量池中的"b"
*
* 深入剖析: StringBuilder的toString():
* 对象6 :new String("ab")
* 强调一下,toString()的调用,在字符串常量池中,没有生成"ab" "ab"这个对象是在堆中的
在常量池中生成了 a 和 b两个字符串对象,并没有ab这个字符串对象。在堆中用两个new创建了两个String对象,
然后通过StringBuilder对象调用append方法进行两次字符串的添加操作,最后用StringBuilder的toString方法进行返回了一个堆中的字符串对象。
*
*/
字节码指令分析:因为串池中可能本来就有a或者b,就不会再创建。 所以答案是4或5或6。4个是java堆中的四个对象。
另外2个是串池里的可能有可能没有。
string a = “a”;string s = a +“b”;此时ab在哪
首先,字符串"a"被创建并存储在字符串常量池中。然后,在第二行代码中,使用字符串拼接操作符将变量a和字符串字面值"b"连接起来。
这将创建一个新的字符串对象,其值为"ab"。
由于连接操作涉及运行时的拼接,而不是在编译时确定的,所以结果字符串"ab"将作为新的对象存储在堆内存中。
这是因为堆内存用于存储运行时创建的对象,而字符串常量池用于存储在编译时已知的字符串字面值。
因此,在这个例子中,"ab"字符串对象存储在堆内存中。
总结起来:
- 字符串"a"和字符串"b"都存储在字符串常量池中。
- 字符串"ab"作为拼接操作的结果,存储在堆内存中。常量池中不会直接存储"ab"这个字符串,因为它是在运行时通过拼接操作得到的新字符串对象。