StringBuffer是线程安全的,线程安全会加同步锁,所以StringBuffer速度慢
StringBuilder是线程不安全的,故速度快
因此速度上:StringBuilder>StringBuffer>String
String速度慢的原因:
String是字符串常量,StringBuilder和StringBuffer均是字符串变量
a. String str = "abc";
b. String str1 = str+"de";
以上a、b两句代码,a执行完之后,创建abc,并且str指向abc。
执行b代码时,先获取str指向的值并获取,然后创建abcde,str1指向abcde。
abc没有被引用后会等待JVM的回收机制回收。
String的追加是不停的创建过程,因此速度慢。
代码测试速度:
String
long starTime = System.nanoTime();
String str = "hadoop" + "_hdfs";
long endTime = System.nanoTime();
System.out.println(str);
System.out.println("程序运行时间:\t"+(endTime-starTime)+"ns");
运行结果:
实则定义了一个字符串变量,故速度快
String拼接:
long starTime = System.nanoTime();
String str = "hadoop";
String str1 = "_hdfs";
String str2 = str + str1;
long endTime = System.nanoTime();
System.out.println(str2);
System.out.println("程序运行时间:\t"+(endTime-starTime)+"ns");
运行结果
StringBuilder拼接:
long starTime = System.nanoTime();
StringBuilder sb = new StringBuilder("hadoop");
sb.append("_hdfs");
long endTime = System.nanoTime();
System.out.println(sb);
System.out.println("程序运行时间:\t"+(endTime-starTime)+"ns");
运行结果:
StringBuffer拼接:
long starTime = System.nanoTime();
StringBuffer sb = new StringBuffer("hadoop");
sb.append("_hdfs");
long endTime = System.nanoTime();
System.out.println(sb);
System.out.println("程序运行时间:\t"+(endTime-starTime)+"ns");
运行结果:
以上运行结果每次可能会有一定的偏差,第一次运行速度会慢一些,但是第二次运行就能看出程序执行时间之间还是存在差距的,如果有问题可以多运行几次求平均。或将字符串的量加大来测试。
总结:
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况