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锁机制的原理以及应用。

  • 相关阅读:
    Win7。56个进程让我头疼
    bzoj2843极地旅行社
    bzoj2751[HAOI2012]容易题(easy)
    bzoj3442学习小组
    bzoj4423[AMPPZ2013]Bytehattan
    bzoj4591[Shoi2015]超能粒子炮·改
    bzoj2299[HAOI2011]向量
    bzoj3223Tyvj 1729 文艺平衡树
    bzoj2563阿狸和桃子的游戏
    bzoj3673可持久化并查集 by zky&&bzoj3674可持久化并查集加强版
  • 原文地址:https://www.cnblogs.com/alisonGavin/p/6925626.html
Copyright © 2011-2022 走看看