StringBuffer与StringBuilder的区别

Posted AlisonGavin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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锁机制的原理以及应用。

以上是关于StringBuffer与StringBuilder的区别的主要内容,如果未能解决你的问题,请参考以下文章

字符串拼接的五种方式

java从基础知识字符串处理

StringBuffer与StringBuilder有什么区别

String 与StringBuffer比较

String与StringBuffer的区别

StringStringBuilder 与 StringBuffer