
Question 20171114 String&&StringBuffer&&StringBuilder的区别和联系
创建成功的String对象,其长度是固定的,内容不能被改变和编译。虽然使用“+”可以达到附加新字符或字符串的目的,但“+”会产生一个新的String实例,会在内存中创建新的字符串对象。如果重复地对字符串进行修改,将极大的增加系统开销。而JavaSE 5.0新增了可变的字符序列StringBuilder类,大大提高了频繁增加字符串的效率。也许我们会问那JavaSE5.0之前呢?实际在JavaSE5.0之前有StringBuffer,但是StringBuffer是线程安全的,这就会造成效率的底下,所以JavaSE5.0新增了StringBuilder来弥补StringBuffer的不足。
String :不可改变
StringBuffer:可改变 线程安全
StringBuilder:可改变 线程不安全
验证连接字符串,String之+和StringBuffer的append谁的效率高
package cn.sb.capacity; public class StringAndStringBuffer {
public static void main(String[] args) {
fun1();
// fun2();
// fun3();
// fun4();
}
/**
* new String
*/
public static void fun1(){
String str1 = new String("");
long start = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
str1 += i;
}
long end = System.currentTimeMillis();
System.out.println("new字符串str1,添加字符串用时:"+(end-start));
}
/**
* 声明字符串
*/
public static void fun2(){
String str2 = "";
long start = System.currentTimeMillis();
for (int i = 0; i < 20000; i++) {
str2 += i;
}
long end = System.currentTimeMillis();
System.out.println("声明字符串str2,添加字符串用时:"+(end-start));
}
/**
* 安全字符串缓冲
*/
public static void fun3(){
StringBuffer sb1 = new StringBuffer("");
long start = System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
sb1.append(i);
}
long end = System.currentTimeMillis();
System.out.println("安全sb1添加字符串用时:"+(end-start));
}
/**
* 高效字符串缓冲
*/
public static void fun4(){
StringBuilder sb2 = new StringBuilder("");
long start = System.currentTimeMillis();
for (int i = 0; i < 200000; i++) {
sb2.append(i);
}
long end = System.currentTimeMillis();
System.out.println("高效sb2添加字符串用时:"+(end-start));
}
}
欢迎各位大神提问题及补充不足和警醒错误!