zoukankan      html  css  js  c++  java
  • 2.2 StringBuffer与StringBuilder的区别

    目录: 1. String 的字符串拼接

        2. StringBuffer的线程安全体现在哪里? 效率低又体现在哪里?

        3. Stringbuilder的线程不安全体现在哪里?效率高又体现在哪里?

    1. String 的字符串拼接
      效率低,为什么?因为String类型是不可变的字符串,字符串拼接需要重新分配内存。

    2. StringBuffer的线程安全体现在哪里? 效率低又体现在哪里?
      StringBuffer是可变的字符序列,
      相对与String的字符拼接,效率要高,
      因为String每次字符串拼接,都需要分配一个新的内存空间;


      而StringBuffer不需要每次分配新的内存空间。
      StringBuffer开始初始化时,new StringBuffer()
      构造器(super(16))设定了16个字符的缓存容量,而且它时可变的字符序列。
      所以在字符串拼接时,不需要分配容量;
      只有当拼接后的字符序列大于16时,首先StringBuffer会去扩充容量,容量的长度为
      拼接后字符串的长度。

    有一个例子,
    ```
    StringBuffer sb = new StringBuffer();
    StringBuffer sb1 = sb.append("a");
    StringBuffer sb2 = sb.append("b");
    System.out.println(sb1);//ab
    ```
    为什么会输出ab,不是a呢,原因是StringBuffer是可变的,共用一个缓存区。
    sb1,sb2,sb都指向缓存区内的new Stringbuffer()对象,而StringBuffer是共用一个缓存区的,
    所以在sb1=sb2=sb = "ab";
    

    线程安全体现在哪里? 要想安全,一般的做法是加把锁,加道门,在底层代码中使用了synchronized锁。

    现在解释一下,为什么加了把锁,它的效率就低。
      比如一个线程需要操作一对象时,而这个对象被另一个线程加了把锁,那么这个线程需要等待原先的线程先把锁打开,再对这个对象进行操作。
      所以在操作上,需要先把锁打开,然后对这个对象进行操作,这个是需要时间的。 
      而非线程安全不需要加锁,所以对这个对象操作就更快。

    3. Stringbuilder的线程不安全体现在哪里?效率高又体现在哪里?
      线程不安全体现在没有在方法和属性上加锁,效率高体现在,线程对对象进行操作,不需要进行解锁操作,
      不需要等待时间。


    以后还需要添加一章synchronized锁机制的原理以及应用。

  • 相关阅读:
    使用C#实现计划任务(corn job)
    python 修改xml文件
    redis安装
    Nginx的安装
    nginx配置
    用泛型减少重复代码,使代码更合理、更优雅
    Tomcat server.xml配置详解
    二维码生成
    轻量级的中文分词工具包
    HTML解析利器
  • 原文地址:https://www.cnblogs.com/alisonGavin/p/6925626.html
Copyright © 2011-2022 走看看