StringBuilder
基本介绍
-
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(StringBuilder 不是线程安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快【后面测】。
-
在 StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。
与StringBuffer继承类和实现结构一致,可看StirngBuffer解释
!!!StringBuilder的方法,没有做互斥的处理,即没有synchronized关键字,因此在单线程的情况下使用
StringBuilder StringBuffer String比较
-
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且方法也-样
-
String∶不可变字符序列,效率低,但是复用率高。
-
StringBuffer∶ 可变字符序列、效率较高(增删)、线程安全,看源码StringBuilder∶ 可变字符序列、效率最高、线程不安全
-
String使用注意说明∶
-
string s="a";//创建了一个字符串
-
s+= "b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能
-
结论∶如果我们对String 做大量修改,不要使用String
-
-
效率测试
public static void main(String[] args) {
long startTime = 0L;
long endTime = 0L;
StringBuffer buffer = new StringBuffer("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {
//StringBuffer 拼接 20000 次
buffer.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuffer 的执行时间:" + (endTime - startTime));
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 80000; i++) {
//StringBuilder 拼接 20000 次
builder.append(String.valueOf(i));
}
endTime = System.currentTimeMillis();
System.out.println("StringBuilder 的执行时间:" + (endTime - startTime));
startTime = System.currentTimeMillis();
String text = "";
for (int i = 0; i < 80000; i++) {
//StringBuilder 拼接 20000 次
text = text + i;
}
endTime = System.currentTimeMillis();
System.out.println("String 的执行时间:" + (endTime - startTime));
}
使用原则
结论:
-
如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
-
如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
-
如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
-
如果我们字符串很少修改,被多个对象引用,使用String, 比如配置信息等