StringBuffer是线程安全的,在源码中可以见到synchronized关键字,效率低
效率比较
伪代码
public static void testRunTime() {
String str = new String();
StringBuffer sb1 = new StringBuffer();
StringBuilder sb2 = new StringBuilder();
long startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
str = str + i;
}
long endTime = System.nanoTime();
System.out.println("Stirng消耗的时间为:" + (endTime - startTime));
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
sb2.append(i);
}
endTime = System.nanoTime();
System.out.println("StirngBuilder消耗的时间为:" + (endTime - startTime));
startTime = System.nanoTime();
for (int i = 0; i < 100000; i++) {
sb1.append(i);
}
endTime = System.nanoTime();
System.out.println("StirngBuffer消耗的时间为:" + (endTime - startTime));
}
使用纳秒比较
结果
Stirng消耗的时间为:20787105769
StirngBuilder消耗的时间为:3617151
StirngBuffer消耗的时间为:5312005
String的”==”与 .equals
String重写了equals方法
所以”==”比较的是内存中的地址,equals比较的是内容
伪代码
String str1 = "a";
String s1 = "a";
String str2 = "b";
String str = str1 + str2;
String str3 = "ab";
String str4 = "a" + str2;
String str5 = new String("ab");
StringBuffer str6 = new StringBuffer("a");
StringBuffer str7 = str6.append("b");
StringBuffer str8 = new StringBuffer("ab");
System.out.println(str1 + str2 == str3);//三个不同的内存地址
System.out.println(str == str3);// str3在编译期间就可以确定,str由变量组成
System.out.println(str1 == s1);// 这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"a"的这么一个对象,它的判断依据是String类equals(Object
// obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。
System.out.println(str3 == str4);// 同第二个解释
System.out.println(str5.toString() == str3);// str5在堆中开辟空间,栈中保存引用,str3在字符串常量池中,两者内存地址不同
System.out.println(str5.toString() == str7.toString());// 两个不同的对象,内存地址不同
System.out.println(str8.toString() == str7.toString());// 两个不同的对象,内存地址不同
结果
false
false
true
false
false
false
false