Question 20171115 String&&StringBuffer&&StringBuilder的区别与联系?
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)); } }
欢迎各位大神提问题及补充不足和警醒错误!