JAVA基础知识|String、StringBuilder、StringBuffer比较
一、简介
String:不可变字符序列
StringBuffer:线程安全的可变字符序列
StringBuilder:非线程安全的可变字符序列
二、示例分析
【示例1】
String A = "123"; String B = "123"; String C = "456"; String D = new String("123");
String B = "123";先检查“123”在字符串常量池中是否存在,如果存在将B指向已有的“123”,如果不存在(如C),则在常量池中新加入“456”;
String D = new String("123");其中“123”也指向常量池中的“123”;
String A = "123"; String B = "123"; System.out.println(A==B); String C = new String("123"); System.out.println(A==C); String D = new String("123"); System.out.println(C==D);
输出结果:(“==”比较的是地址是否相同)
true false false
【示例2】
String A = "123"; String B = "456"; String AB = A+B; String C = "123456"; System.out.println(AB==C); String D = "123"+"456"; String F = "123456"; System.out.println(D==F);
输出结果:
false true
String AB = A+B;首先会在堆中创建一个StringBuilder对象,并将A作为初始化的值;再通过append()方法合并B的值,最后再通过toString()方法在堆中创建一个String对象,将堆地址存放在AB中。
“123”+“456”;在编译期就会自动合并为“123456”,所以D与F指向的是同一个地址。
【示例3】
//代码1 String A = ""; for(int i=0;i<100000;i++){ A=A+i; } //代码2 StringBuilder B =new StringBuilder(""); for(int i=0;i<100000;i++){ B.append(i); }
代码1耗时:28067ms
代码2耗时:15ms
A=A+i,进行累加时,会出现和示例二中同样的情况,不停的生成对象,导致性能很差。
B.append(i),不会生成新的对象,只是同一个对象的不停累加。
三、总结
1、能够确定的字符串常量,完全没有必要创建StringBuilder或StringBuffer对象。直接使用字符串常量的"+"连接操作效率最高。
2、StringBuilder和StringBuffer对象的append效率要高于String对象的“+”操作。
3、StringBuilder比StringBuffer的性能稍高,但是StringBuffer线程安全。当有多线程的情况出现时,StringBuffer更安全。