当String的对象,从a编程ab的时候,底层jvm会执行哪些操作?

我觉这个问题会设计到很多的知识点

    public static void f3(){
        String str = "a";
        str+="b";
    }

例如线程,栈,堆

各位们可以说下自己的理解吗?

先创建一个str指向存储a的内存,相加的时候产生b的内存,加完产生存储ab的内存并且str指向存储ab的内存,a b短时间还再占用内存随后被回收

字符串的操作相对特殊,每次操作都会重新创建您的对应,所以很多都建议用stringbiilder来减少这种开销

此时产生三个对象。
a
b
ab
最后str指向ab

String str = "a";
相当于String str = new String("a");
str+="b"; 即 str = str+"b";
相当于一个常量表达式, jvm自动将表达式优化为 str = "ab";

其實底層已經對此進行優化成stringbuilder了,如str = a + b + c +d,就是StringBuilder操作數據的,只是當執行for等循環時其會始終創建一個新的stringbuilder,for(int i= 0 ; i < 10 ; i++) str += a;其始終都數據重新優化成stringbuilder,而若一開始就申明stringbuilder那麼就不會重複申明,上面的幾位應該是單純的看5-6年前的老版本的書籍所以才會J覺得始終創建一個string對象

String str = "a"; 先去常量池中找"a", 常量池中有,则不分配内存,常量池中没有,会在常量池中分配一个内存空间给"a", 然后 栈中生成引用对象String str ,
str+="b"; 去常量池中找"b", 常量池中有,则不分配内存,常量池中没有,会在常量池中分配一个内存空间给"b",
即 str = str+"b"; 相当于一个常量表达式, jvm自动将表达式优化为 str = "ab"; 去常量池中找"ab", 常量池中有,则不分配内存,常量池中没有,会在常量池中分配一个内存空间给"ab", 然后引用给str对象