执行速度:
String
原因: String类被final修饰,不可改变,创建的字符串都是一个常量,每次修改String值时,实际上JVM都是重新创建新的常量,之前的那个值会被作为垃圾进行回收.而StringBuilder和StringBuffer是字符变量,每次值的改变都是对同一个对象进行操作,所以不会new新的对象和销毁之前的对象,所以效率比String高.
StringBuffer比StringBuilder慢的原因是因为StringBuffer是线程安全的,他底层的很多方法比如append()方法都被synchronized修饰,加了同步锁,所以效率会比较低.
而StringBuilder快的原因是因为他的方法没有加同步锁,所以执行效率高,但是在多线程并发情况下是非线程安全的.(JDK1.0就存在String和StringBuffer,但是在JDK1.5的时候才新增的StringBuilder,目的就是为了提高效率可以多一个选择)
使用场景:
如果是少量的字符串操作选择String(方便)
如果单线程下大量操作字符串选择StringBuilder(不考虑线程安全情况下效率高)
如果多线程下操作大量字符串选择StringBuffer(因为要考虑线程安全,所以必须牺牲效率)
备注:
String oop = "a"+"b"+"c";
这种情况下JVM只会创建一个常量oop值为abc;
但是
String s = "a";
String f = "b";
String h = "c";
String ss = s+f+h;
这种情况下JVM会先创建一个s常量值为a,在创建一个f常量值为b,在创建一个h常量值为c,最后创建一个ss常量值为abc,和上面的oop字符串创建过程是不一样的.
—不积跬步无以至千里,不积细流无以成江海