您的位置:首页 > 产品设计 > UI/UE

JAVA String StringBuffer StringBuilder 区别

2017-11-09 13:57 441 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: