A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

在编写JAVA代码的过程中有时要频繁地对字符串进行拼接,如果直接用"+"拼接的话会建立很多的String型对象,严重的话会对服务器资源和性能造成不小的影响;而使用StringBuilder和StringBuffer能解决以上问题。据说StringBuffer是线程安全的,而StringBuilder不是线程安全的,大家能否举个简单的例子说明StringBuilder和StringBuffer适用的场景?
具体说原理的话,两个字符串相加,相当于执行了如下操作:
str1 + str2 执行了下面的过程:

    StringBuffer sb1 = new StringBuffer(str1);
    sb1.append(str2);
    String result1 = sb1.toString();

执行到最后,我们所需要的内容只有result1这一个对象,中间出现的sb1就成为了垃圾回收的目标。

此时,如果我们再加一个字符串的话……
str1 + str2 + str3相当于在上面的基础上又执行了

    StringBuffer sb2 = new StringBuffer(result1);
    sb2.append(str3);
    String result2 = sb2.toString();

这时,对我们有用的对象只有result2一个。中间生成的sb2和result1都成为了垃圾回收的目标。
如果继续追加下去,又会产生若干个StringBuffer的垃圾对象和String的垃圾对象。

Java中的垃圾首先是占用内存,然后Java虚拟机会请出垃圾回收线程来回收这些垃圾,这时又会出现CPU的损耗,同时这些垃圾对象生成的时候也会产生系统开销。如果在一个循环中使用字符串的加号,导致的系统开销就是不可忽略的了。

而相对来说使用StringBuffer来进行字符串连接的话,

    StringBuffer sb = new StringBuffer();
    sb.append(str1);
    sb.append(str2);
    .....
    sb.append(strN);
    String result = sb.toString();


除了中间的一个StringBuffer对象最后会被弃掉,其他都是有效对象,比起上面的一堆垃圾,自然效率提高的不是一点半点。

至于两者到底会差多少,根据分批给Java虚拟机的内存大小等环境的不同会有所差异。

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马