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

原文地址:https://www.cnblogs.com/alisonGavin/p/6925626.html