zoukankan      html  css  js  c++  java
  • Java String,StringBuffer和StringBuilder的区别

    【可变与不可变】

    • String是字符串常量,不可变。
    • StringBuffer和StringBuilder是字符串变量,可变。

    【执行速度方面】

    • StringBuilder > StringBuffer > String (StringBuilder是线程不安全的,StringBuffer是线程安全的)

    为什么执行速度StringBuffer一般大于String?

         因为String是不可变的对象,如果使用String进行字符串操作,如字符串拼接,会生成很多的中间String对象,这些对象如果不能及时被GC回收器回收,就会一直占用内存,导致程序运行变慢,也就是手机或电脑经常出现的卡机现象。

    为什么执行速度StringBuilder大于StringBuffer?

        因为StringBuffer是线程安全的,所以对于多线程访问的场景,编译器会对StringBuffer表示的字符串缓冲区进行加锁,所以访问起来会慢一点,看到一个比较形象的解释,就是回家拿东西,当家里有门的时候,需要掏钥匙开锁然后拿东西,当家里没门的时候就可以直接到房间里去拿东西,自然就快了。

    【使用场景】

    • 在涉及到比较大的数据量,需要使用字符串拼接时,尽量使用StringBuffer和StringBuilder,而不是String,当涉及到较少的数据量时,直接使用String就好。
    • 单线程操作字符串缓冲区的大量的数据时用StringBuilder,效率更高;多线程操作字符串缓冲区的大量数据时用StringBuffer,线程更安全。

    【备注】

         对于使用“+”操作符来拼接字符串,虽然编译器会自动创建StringBuilder(Java SE5引入)对象,来进行优化,但这个优化程度是有限制的,看下面的例子:

        public String implicit(String[] fields) {
            String result = "";
            for (int i = 0; i < fields.length; i++) {
                result += fields[i];
            }
            return result;
        }
        
        public String explicit(String[] fields) {
            StringBuilder result = new StringBuilder();
            for (int i = 0; i <  fields.length; i++) {
                result.append(fields[i]);
            }
            return result.toString();
        }

    对于implicit方法,编译器在每一次进行for循环时都会创建一个StringBuilder对象;而explicit显式地创建一个StringBuilder对象只需要一次,而且在知道目标字符串大小的情况下,还可以指定StringBuilder的大小,这样可以避免多次重新分配缓冲。

  • 相关阅读:
    Office加载项安装
    Office加载项
    centos部署vue项目
    centos系统下安装Nginx
    MongoDB 安装笔记
    CDN基本工作过程
    前端常见跨域解决方案(全)
    JS 扁平化(flatten) 数组
    console.log 打印的值不准确
    arr.flat(Infinity)数组扁平化
  • 原文地址:https://www.cnblogs.com/hubavyn/p/6242670.html
Copyright © 2011-2022 走看看