概述
在日常撸码中,经常会有字符串的合并,如果数据小还好,如果数据大的话,就会涉及到一个效率的问题。我们经常使用String,但是,实际上还有StringBuffer、StringBuilder。我们来验证一下它们的效率。累加字符串10000次,比较它们所用的时间。
String
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3;
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str1 = str1 + "123123123";
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
运行时间为:time:359
StringBuffer
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3;
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
str2.append("123123123");
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
运行时间为:time:0
我们把次数加大到100000次
运行时间为:time:16
StringBuilder
同样我们把次数加大到100000次
public static void main(String[] args) {
String str1 = "";
StringBuffer str2 = new StringBuffer();
StringBuilder str3 = new StringBuilder();
long lasttime = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
str3.append("123123123");
}
long currenttime = System.currentTimeMillis();
System.out.println("time:"+(currenttime-lasttime));
}
运行时间为:time:0
我们再次把次数加大到100000次
运行时间为:time:31
总结
由上面的数据可以看出,拼接字符串的效率是:
String < StringBuffer < StringBuilder
在API文档中,StringBuffer的介绍是:
线程安全的可变字符序列。
StringBuilder的介绍是:
一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。StringBuilder 的实例用于多个线程是不安全的。如果需要这样的同步,则建议使用 StringBuffer。