1. Java中StringBuffer和StringBuilder
class="java" name="code">
String是一个不可变的对象,每次修改String对象实际上是创建新对象,并将引用指向新对象。效率很低。
StringBuffer是可变的,即每次修改只是针对其本身,大部分情况下比String效率高,StringBuffer保证同步(synchronized),所以线程安全。
StringBuffer使用时最好指定容量,这样会比不指定容量快30%-40%,甚至比不指定容量的StringBuilder还快。
StringBuilder没有实现同步,所以非线程安全。但效率应该比StringBuffer高。
1. String最慢的原因
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
2. 线程安全
StringBuilder是线程不安全的,而StringBuffer是线程安全的。
StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的。
StringBuilder的方法则没有synchronized关键字,所以不能保证线程安全,有可能会出现一些错误的操作。
3. 使用情况
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
StringBuffer常用方法
1) public StringBuffer append(String s) 将指定的字符串追加到此字符序列
2) public StringBuffer reverse() 将此字符序列用其反转形式取代
3) public delete(int start, int end) 移除此序列的子字符串中的字符
4) public insert(int offset, int i) 将 int 参数的字符串表示形式插入此序列中
5) replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符