JS Bin

StringBuffer和StringBuilder,在字符串拼接时尽量减少“+”的使用

  (摘录加总结------)

  (1)为什么拼接字符串使用StringBuffer和StringBuilder

  在字符串拼接的时候尽量使用StringBuffer和StringBuilder,而尽量减少“+”的使用,比如下面这段代码:“111”,“222”,“333”这些都是在编译期间就被确定下来的数据,但是实际上在底层(如果反编译class文件获取到的字节码可以看出)编译器每次碰到"+"的时候,会new一个StringBuilder出来,接着调用append方法,再调用toString方法,生成新字符串。那么,这意味着,如果代码中有很多的"+",就会每个"+"生成一次StringBuilder,这种方式对内存是一种浪费,效率很不好。由于这样子拼接字符串的低效,我们才需要使用StringBuilder和StringBuffer来拼接字符串。

public class StringTest {

    @Test
    public void testStringPlus() {
        String str = "111";
        str += "222";
        str += "333";
        System.out.println(str);
    }
    
}

  (2)使用StringBuffer和StringBuilder拼接字符串

  StringBuffer和StringBuilder原理一样,无非是在底层维护了一个char数组,每次append的时候就往char数组里面放字符而已,在最终sb.toString()的时候,用一个new String()方法把char数组里面的内容都转成String,这样,整个过程中只产生了一个StringBuilder对象与一个String对象,非常节省空间。StringBuilder唯一的性能损耗点在于char数组不够的时候需要进行扩容,扩容需要进行数组拷贝,一定程度上降低了效率

public class TestMain
{
    public static void main(String[] args)
    {
        StringBuilder sb = new StringBuilder("111");
        sb.append("222");
        sb.append("111");
        sb.append("111");
        sb.append("444");
        System.out.println(sb.toString());
    }
}

  StringBuffer和StringBuilder二者的区别主要就是StringBuffer是线程安全的,而StringBuilder是线程不安全的。StringBuffer对所有方法都做了同步,但是这样同步会带来一定的消耗。所以在不涉及线程安全的场景,比如方法内部,尽量使用StringBuilder

  (3)使用+拼接字符串的场景

  若在拼接字符串的时候使用的是连续“+”字符串的情况,是可以使用+来拼接字符串的,因为"111"、"222"、"333"、"444"都是编译期间即可得知的常量,这样子JVM在编译的时候并不会生成一个StringBuilder而是直接生成字符串"111222333444"。就这种连续+的情况,实际上编译的时候JVM会只产生一个StringBuilder并连续append等号后面的字符串。

public class TestMain
{
    public static void main(String[] args)
    {
        String str = "111" + "222" + "333" + "444";
        System.out.println(str);
    }
}

 

posted @ 2020-03-23 16:41  左五六  阅读(881)  评论(0编辑  收藏  举报