Java之String,StringBuffer,StringBuilder类

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

原文地址:https://www.cnblogs.com/liyiran/p/4747017.html