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