• 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的大小,这样可以避免多次重新分配缓冲。

  • 相关阅读:
    快速理解平衡二叉树、B-tree、B+tree、B*tree
    centos 7(6) linux系统安装 mysql5.7.17(glibc版)
    关于使用Hibernate+spring+dubbo的实现微服务对象查询
    Keepalived+Nginx实现高可用(HA)
    Nginx源码安装
    Keepalived安装与配置
    单点fastDfs+centos7搭建
    Dubbo+zookeeper使用方法以及注意事项
    mac 下 iterm2 不能使用 rz sz
    java 无符号整型
  • 原文地址:https://www.cnblogs.com/hubavyn/p/6242670.html
Copyright © 2020-2023  润新知