String b = a +“2“;创建了几个对象;new String(“a“) + new String(“b“)呢?

你认为 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,就不会再创建。 所以答案是4564个是java堆中的四个对象。
 另外2个是串池里的可能有可能没有。

String b = a +“2“;创建了几个对象;new String(“a“) + new String(“b“)呢?_第1张图片
string a = “a”;string s = a +“b”;此时ab在哪

首先,字符串"a"被创建并存储在字符串常量池中。然后,在第二行代码中,使用字符串拼接操作符将变量a和字符串字面值"b"连接起来。
这将创建一个新的字符串对象,其值为"ab"。

由于连接操作涉及运行时的拼接,而不是在编译时确定的,所以结果字符串"ab"将作为新的对象存储在堆内存中。
这是因为堆内存用于存储运行时创建的对象,而字符串常量池用于存储在编译时已知的字符串字面值。

因此,在这个例子中,"ab"字符串对象存储在堆内存中。

总结起来:

  • 字符串"a"和字符串"b"都存储在字符串常量池中。
  • 字符串"ab"作为拼接操作的结果,存储在堆内存中。常量池中不会直接存储"ab"这个字符串,因为它是在运行时通过拼接操作得到的新字符串对象。

你可能感兴趣的:(Java常用类,java,jvm,开发语言)