1.String与StringBuffer
(1)String类对象为不可变对象,查看源码,发现被public final修饰,一旦修改了String对象的值,则会隐性的创建一个新的对象,释放原对象;而StringBuffer为可修改对象,如可以通过append()方法完成添加操作;
(2)性能方面:String < StringBuffer
2.StringBuffer与StringBuilder
(1)两者都是继承自AbstractStringBuilder类
(2)StringBuffer的大多数方法是同步的,也是线程安全的,因此适合在多线程下操作;而StringBuilder则是非同步的,适合在单线程下操作。
(3)查看源码可知,StringBuilder可以操作StringBuffer,而StringBuffer不能操作StringBuilder。
(4)性能方面:StringBuffer < StringBuilder,因为StringBuffer要维护同步锁,消耗掉部分资源。
下面通过测试代码来比较三者的时间性能:
//在时间性能方面:String < StringBuffer < StringBuilder
public class StringBufferWithStringBuilder {
public static void testString() {
long start = System.currentTimeMillis();
String str = null;
for (int i = 0; i < 20000; i++) {
str = str + i + ",";
}
System.out.println(System.currentTimeMillis() - start);
}
public static void testStringBuffer() {
long start = System.currentTimeMillis();
StringBuffer sbuf = new StringBuffer();
for (int i = 0; i < 20000; i++) {
sbuf.append(i + ",");
}
System.out.println(System.currentTimeMillis() - start);
}
public static void testStringBulider() {
long start = System.currentTimeMillis();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 20000; i++) {
builder.append(i + ",");
}
System.out.println(System.currentTimeMillis() - start);
}
public static void main(String[] args){
testString();
testStringBuffer();
testStringBulider();
}
}
结果截图:
显然,在时间性能方面:String < StringBuffer < StringBuilder.