u013179958
CSDNRGY
采纳率99.5%
2016-03-26 06:10 阅读 1.7k
已采纳

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

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

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

例如线程,栈,堆

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

6条回答 默认 最新

  • 已采纳
    u012725164 合约交易所 2016-03-26 08:40

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

    点赞 评论 复制链接分享
  • bdmh bdmh 2016-03-26 07:20

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

    点赞 评论 复制链接分享
  • crazy1235 月盡天明 2016-03-26 08:32

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

    点赞 评论 复制链接分享
  • Ghost_war Ghost_war 2016-03-26 08:54

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

    点赞 评论 复制链接分享
  • qq970973742 qq970973742 2016-03-26 09: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 09:45

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

    点赞 评论 复制链接分享

相关推荐