在 java 语言中, 用来处理字符串的的类常用的有 3 个: String、StringBuffer、StringBuilder。
它们的异同点:
1) 都是 final 类, 都不允许被继承;
2) String 长度是不可变的, StringBuffer、StringBuilder 长度是可变的;
3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的。就是说StringBuffer类中的很多方法使用了synchronized关键字修饰,允许多线程进行操作字符串。
三个类大部分时间性能:StringBuilder》StringBuffer》String。
4) StringBuffer 和StringBuilder 方法的使用基本上一样
使用以下代码测试性能:
public class TestStringClass { private final int LOOPS = 200000;
private final String CONSTANT_STRING = "java-String"; public static void main(String[] args) { new TestStringClass().testString();
new TestStringClass().testStringBuffer();
new TestStringClass().testStringBullder();
} public void testString() {
String string = "";
long currentTime = System.currentTimeMillis();
for (int i = 0; i < LOOPS; i++) {
string += CONSTANT_STRING;
}
long endTime = System.currentTimeMillis();
System.out.println("String: " + (endTime - currentTime));
} public void testStringBuffer() {
StringBuffer stringBuffer = new StringBuffer();
long currentTime = System.currentTimeMillis();
for (int i = 0; i < LOOPS; i++) {
stringBuffer.append(CONSTANT_STRING);
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuffer: " + (endTime - currentTime));
} public void testStringBullder() {
StringBuilder stringBuilder = new StringBuilder();
long currentTime = System.currentTimeMillis();
for (int i = 0; i < LOOPS; i++) {
stringBuilder.append(CONSTANT_STRING);
}
long endTime = System.currentTimeMillis();
System.out.println("StringBullder: " + (endTime - currentTime));
}
}
结果:
String: 149549
StringBuffer: 9
StringBullder: 7
差别很明显。String的性能差的厉害。
但是呢,假如在编译阶段使用字符串常量的话,String的性能会很快的。
总结:
1.在编译阶段使用字符串常量的话,使用String。比如:String haha = "I" + " am " + "java";
2.在不考虑线程安全的情况下,StringBuilder对象的append效率高于StringBuffer对象的append效率要高于String对象的"+"连接操作。
3.多线程同步的情况下,建议使用StringBuffer。