String字符串的累加操作

          在程序的开发中,String的拼接会经常用到,如何使它工作的更好,就需要我们考虑和研究一下了。String的拼接的底层真的非常有趣,不信?那咱们走着瞧....

           案例一:String str = "I" + "love" + "you" + "love";  这段代码会生成几个对象?

           很多初学者会回答:3个、4个、6个。 按照我之前的理解,它会生成六个对象:I love you IIove IIoveyou  IIoveyoulove。根据String对象的不变性和常量池的特性先是常量池中生成三个对象I love you, 然后自左向右依次拼接生成IIove IIoveyou  IIoveyoulove生成三个对象实例。是不是很多人也是这样理解的。如果真是这样的话,这段代码效率很不高啊。但是事实真是如此吗,那我们就借助反编译工具(jd-gui 网上很容易下载的到)来分析一下吧。

import java.io.PrintStream;

public class StringTest
{
  public static void main(String[] paramArrayOfString)
  {
    String str = "Iloveyoulove";
    System.out.println(str);
  }
}

           上面代码是使用反编译出来,可以看出对象这种常量字符串的拼接,jvm在编译时就做了充分的优化,因此在运行时并不会产生大量的实例来。因此可以得出答案是:只会产生一个对象

         案例二: 变量字符串拼接

                        String str1 = "I";

                        String str2 = "Iove";

                        String str3 = "you";

                        String str = str1 + str2 + str3 + str2;

            对于这种未知str变量的取值,在运行时会很慢吗?这段代码总共会产生几个对象?

            首先可以明确的知道会产生str1、str2、st3三个的对象实例,但是str呢?是自左向右拼接呢?还是和案例一一样呢?不清楚? 好那咱们再分析一次。

            首先使用反编译工具查看反编译后的代码:

import java.io.PrintStream;

public class StringTest2 { public static void main(String[] paramArrayOfString) { String str1 = "I";
    String str2 = "love";
    String str3 = "you";
    String str4 = str1 + str2 + str3 + str2;
    System.out.println(str4);
  }
}

         如上面反编译结果看,好像没太大的改变啊,是不是结果就是自左向右拼接了呢?别急,咱们再继续往下分析,看看常量池是怎么样的,使用javap -v StringTest2.class 可以查看。

  

         从常量池分析,确实生成了str1、str2、str3的常量池对象。可是绿色的框圈出来的是什么鬼,代码里也没有调用StringBuilder啊,怎么会莫名其妙的出现了它呢?  这个其实就是jvm对这种变量字符串拼接的优化。对于变量字符串的拼接,jvm是用来StringBuilder进行了优化。

       根据常量池的数据分析: 实际上String str = str1 + str2 + str3 + str2; 就相当于StringBuilder str = (new StringBuilder(str1).append(str2).append(str3).append(str2)).toString();

      所以可以得出这段代码并不会很慢,会产生4个对象。

     哈哈,是不是很有意思呢?自己动手也操作一下吧。学以致用!

参考文章:

    《Java程序性能优化 让你的java程序更快、更稳定》. 3.1.4

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值