2 u013179958 u013179958 于 2016.03.26 14:10 提问

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

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

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

例如线程,栈,堆

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

6个回答

u012725164
u012725164   2016.03.26 16:40
已采纳

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

bdmh
bdmh   Ds   Rxr 2016.03.26 15:20

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

crazy1235
crazy1235   Ds   Rxr 2016.03.26 16:32

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

Ghost_war
Ghost_war   2016.03.26 16:54

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

qq970973742
qq970973742   2016.03.26 17:12

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

ly881010
ly881010   2016.03.27 17:45

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

lxr0724
lxr0724 str +="b" 这不是初始化语句,没有编译优化,jvm会在堆中生成"ab"对象,不在常量区。 可尝试 string s ="ab" string a ="a" a+="b" a==s?
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!