• 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);
        }
    }
    

     

  • 相关阅读:
    反射:框架设计的灵魂
    Junit测试
    XML笔记
    map 的用法
    opencv总结1
    光源
    镜面反射
    openGL纹理对象
    GPU入门
    动态规划1
  • 原文地址:https://www.cnblogs.com/dashenaichicha/p/12553088.html
Copyright © 2020-2023  润新知