StringBuffer/StringBuilder/String的区别
1、在執(zhí)行速度上:Stringbuilder->Stringbuffer->String
2、String是字符串常量
? ? ? Stringbuffer是字符串變量
? ? ? Stringbuilder是字符串變量
?
? ? ?有可能我們會疑惑String怎么是字符串變量??匆韵麓a:
? ? ?String str = adc;
? ? ?str = str + “ef”;
? ? ?System.out.println(str);
?
? ? 輸出結(jié)果為:abcef;
? ? 在Java虛擬機中str為adc時是一個變量,當str被重新賦值為adcef時為另一個變量,被重新分配了一次內(nèi)存,上次使用的內(nèi)存會被gc在適當?shù)臅r候回收掉。由于這種機制導致了如果有大量的String賦值操作時,會導致運行速度的緩慢,以及內(nèi)存使用量的上升。
?
String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,這樣不僅效率低下,而且大量浪費有限的內(nèi)存空間。
我們來看一下這張對String操作時內(nèi)存變化的圖:?
?
?
我們可以看到,初始String值為“hello”,然后在這個字符串后面加上新的字符串“world”,這個過程是需要重新在棧堆內(nèi)存中開辟內(nèi)存空間的,最終得到了“hello world”字符串也相應的需要開辟內(nèi)存空間,這樣短短的兩個字符串,卻需要開辟三次內(nèi)存空間,不得不說這是對內(nèi)存空間的極大浪費。為了應對經(jīng)常性的字符串相關(guān)的操作,谷歌引入了兩個新的類——StringBuffer類和StringBuild類來對此種變化字符串進行處理。
當對字符串進行修改的時候,需要使用?StringBuffer 和 StringBuilder 類。
和?String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,并且不產(chǎn)生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在于 StringBuilder 的方法不是線程安全的(不能同步訪問)。
由于?StringBuilder 相較于 StringBuffer 有速度優(yōu)勢,所以多數(shù)情況下建議使用?StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用?StringBuffer 類。
?
三者的繼承結(jié)構(gòu)
?
?
三者的區(qū)別:
?
初始化上的區(qū)別,String可以空賦值,后者不行,報錯
①String
StringBuffer s = null; ??
StringBuffer s = “abc”; ??
②StringBuffer
StringBuffer s = null; //結(jié)果警告:Null pointer access: The variable result can only be null at this location
StringBuffer s = new StringBuffer();//StringBuffer對象是一個空的對象
StringBuffer s = new StringBuffer(“abc”);//創(chuàng)建帶有內(nèi)容的StringBuffer對象,對象的內(nèi)容就是字符串”
?
3、一個特殊的例子
? ? String str = “this is only a” + “simple” + “test”;
? ? StringBuffer stringBuffer ?= new StringBuffer("this is only a").append("simple").append("test");
?
? ?你會很驚訝的發(fā)現(xiàn),生成str對象速度簡直太快了,而這個時候Stringbuffer居然速度上根本一點都不占優(yōu)勢。其實這是JVM的一個把戲,實際上:
? ?String str ?= ?”this is only a“ + "simple" + "test";
? ?其實就是
? ?String str = “this is only a simple test”;
? ?所以不需要太多的是時間。但大家這里需要注意的是,如果你的字符串是來自另外的String對象的話。速度就沒那么快了,譬如:
? ?String str1 = “this is only a”;
? ?String str2 = "simple";
? ?String str3 = "test";
? ?String str = str1 + str2 + str3;
? ?這時候JVM會規(guī)規(guī)矩矩的按照原來的方式去做。
?
4、StringBuilder與StringBuffer
? ? ? StringBuilder:線程非安全的
? ? ? StringBuffer:線程安全的
? ? ? 當我們在字符串緩沖區(qū)去被多個線程使用時,JVM不能保證StringBuilder的線程是安全的,雖然他的速度最快,但是可以保證StringBuffer是可以正確操作的。當然大多數(shù)情況是在單線程下進行的,所以大多數(shù)情況下是建議用StringBuilder而不用StringBuffer的,就是速度的原因。
?
?
1、StringBuffer 與 StringBuilder 中的方法和功能完全是等價的
?
2、只是StringBuffer 中的方法大都采用了?synchronized?關(guān)鍵字進行修飾,因此是線程安全的,而 StringBuilder 沒有這個修飾,可以被認為是線程不安全的。
?
3、在單線程程序下,StringBuilder效率更快,因為它不需要加鎖,不具備多線程安全而StringBuffer則每次都需要判斷鎖,效率相對更低。
?
?
5、對于三者的總結(jié):1)如果操作少量的數(shù)據(jù)用String
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 2)單線程下操作大量的數(shù)據(jù)用StringBuilder
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 3)多線程下操作大量的數(shù)據(jù)用StringBuffer
?
轉(zhuǎn)載自:http://www.cnblogs.com/A_ming/archive/2010/04/13/1711395.html
轉(zhuǎn)載于:https://www.cnblogs.com/wfhking/p/9464041.html
總結(jié)
以上是生活随笔為你收集整理的StringBuffer/StringBuilder/String的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: makefile / CMake
- 下一篇: k3刷机 重置_斐讯K3刷机教程:一直重