面试题解2-String、StringBuffer与StringBuilder的区别
String、StringBuffer与StringBuilder的区别
(1)三者在执行速度方面的比较:StringBuilder > StringBuffer > String
(2)String <(StringBuffer,StringBuilder)的原因:
String:字符串常量;StringBuffer:字符串变量;StringBuilder:字符串变量
String是字符串常量,在创建之后就无法更改。
StringBulier一般用于字符串之间拼接操作。
String s = "1234";
s = s+"5";
System.out.println(s);
结果是:12345
看过上述代码之后,首先,jvm创建出“1234”对象,字符串进行拼接的时候会将字符串对象转化为StringBuilder的形式进行拼接,此刻,除了创建一个StringBuilder对象之外,在拼接的时候常量池中会再创建一个“5”对象。
在jdk1.7之前是没有用StringBuilder进行优化的,字符串拼接的效率相对较低,但是编译上的优化不一定总会有效,在比较简单的情况下,编译器会给我们做好优化,但是如果是较为复杂的情况下,编译器也无法做到完美优化。所以,在字符串拼接的时候如果要注重效率的话,就尽量使用StringBuilder进行字符串的拼接。
StringBuffer是字符串变量,它是可以改变的对象,当我们对它进行操作时,相当于直接对这个对象进行操作。这样的话不会像String一样创建一个新对象,效率自然就高了。特殊的例子,String str = “This is only a” + “ simple” + “test”;使用这种方式拼接的时候,无需创建额外新的对象,速度是比另外两种方法更快的。
StringBuilder在多线程的情况下,是线程非安全的,StringBuffer是线程安全的,在字符串缓冲区被多个线程使用时,JVM并不能保证StringBuilder的操作是安全的,虽然StringBuilder的字符串拼接效率高,但是无法保证线程安全的情况下,StringBuffer是可以正确操作的。
使用情况总结:
①如果要操作少量的字符串数据,那么直接使用String
②单线程操作字符缓冲区下的大量数据,那么使用StringBUilder效率比较高
③多线程操作字符缓冲区下的大量数据,那么使用StringBuffer能够保证正确进行操作