首页 > 代码库 > StringBuffer与StringBuilder的区别
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的区别