Java之String,StringBuffer,StringBuilder类

时间:2023-12-21 21:39:50

在 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。