zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    

     

  • 相关阅读:
    机器学习100天——实现简单线性回归(第二天)
    一起学Hive——详解四种导入数据的方式
    一起学Hive——创建内部表、外部表、分区表和分桶表及导入数据
    Apache Pulsar——企业级消息订阅系统介绍
    一起学Hadoop——实现两张表之间的连接操作
    一起学Hadoop——文件的上传、分发与打包
    机器学习100天——数据预处理(第一天)
    java调用python程序以及向python程序传递参数
    页面中查询模块的设计与实现思路
    以前的博客内容迁至CSDN,博客名不变,以后博客将在两个平台同步更新
  • 原文地址:https://www.cnblogs.com/dashenaichicha/p/12553088.html
Copyright © 2011-2022 走看看