1.可变性
String不可变,即每次对String
对象进行改变时,都会生成一个新的String
对象,旧的String
对象保持不变。
StringBuffer / stringBuilder可变,即可以在原有字符串基础上进行修改,不会生成新的对象。
2.线程安全性
String安全
stringBuffer线程安全,里面的方法基本上都有synchronized
StringBuilder不是线程安全的,里面的方法没有synchronized。
3.效率上:
string<stringBuffer<StringBuilder
public class StringDemo {
public static void main(String[] args) {
// 使用String进行字符串拼接
String stringConcat = "";
for (int i = 0; i < 1000; i++) {
stringConcat += i;
}
System.out.println("String Concatenation Completed.");
// 使用StringBuffer进行字符串拼接
StringBuffer stringBufferConcat = new StringBuffer();
for (int i = 0; i < 1000; i++) {
stringBufferConcat.append(i);
}
System.out.println("StringBuffer Concatenation Completed.");
// 使用StringBuilder进行字符串拼接
StringBuilder stringBuilderConcat = new StringBuilder();
for (int i = 0; i < 1000; i++) {
stringBuilderConcat.append(i);
}
System.out.println("StringBuilder Concatenation Completed.");
}
}
在上面的代码中,我们分别使用String
、StringBuffer
和StringBuilder
进行了字符串的拼接操作。你可以注意到,当使用String
进行大量字符串拼接时,性能可能会受到影响,因为每次拼接都会生成新的String
对象。而StringBuffer
和StringBuilder
则不会这样,它们可以在原有对象上进行修改。
另外,StringBuffer
和StringBuilder
之间的主要区别在于线程安全性。在多线程环境下,如果你需要确保字符串拼接的线程安全,应该使用StringBuffer
。而在单线程环境下,为了获得更好的性能,你可以使用StringBuilder
。