String,StringBuilder,StringBuffer的区别
首先,简要来看,String是只读的不可变对象,每次更改String都会产生一个新的String对象,而StringBuidler和StringBuffer是可变的字符串对象。
a) 从继承角度看
StringBuilder,StringBuffer都继承AbstractStringBuilder,同时AbstractStringBuilder和String都实现了CharSequence接口
b) 从锁,线程安全性的角度来看
StringBuilder的拼接方法没有加synchronized关键字,是线程不安全的,但执行效率较高。
StringBuffer的拼接方法有加synchronized关键字,是线程安全的,但执行效率相对StringBuilder较低。
String,StringBuffer,StringBuilder的运行效率比较
String
@Test
public void testString() {
String s = "";
long start = System.currentTimeMillis();
for (int i = 0; i < 10000 * 10; i++) {
s += "abc";
}
long end = System.currentTimeMillis();
System.out.println("执行十万次字符串拼接,String花了"+(end - start)+"毫秒");
}
StringBuffer
执行一亿次字符串拼接,StringBuffer花了4255毫秒
@Test
public void testStringBuffer() {
StringBuffer sb = new StringBuffer();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000 * 10000; i++) {
sb.append("abc");
}
long end = System.currentTimeMillis();
System.out.println("执行一亿次字符串拼接,StringBuffer花了"+(end - start)+"毫秒");
}
StringBuilder
执行一亿次字符串拼接,StringBuilder花了1480毫秒
@Test
public void testStringBuilder() {
StringBuilder sb = new StringBuilder();
long start = System.currentTimeMillis();
for (int i = 0; i < 10000 * 10000; i++) {
sb.append("abc");
}
long end = System.currentTimeMillis();
System.out.println("执行一亿次字符串拼接,StringBuilder花了"+(end - start)+"毫秒");
}
结论: 执行效率 String < StringBuffer < StringBuilder
c) 从应用场景角度
StringBuilder适合单线程下操作字符串,StringBuffer适合多线程下操作字符串,String适合操作少量字符串数据