這個三個類在我們開發(fā)過程中經(jīng)常會遇到蒿叠,在處理字符串中的位置相當(dāng)重要,因此我們必須記住他們之間的差異蚣常。
String和StringBuffer市咽、StringBuilder的區(qū)別
String:
字符串常量,是不可改變的對象抵蚊。
String s = "abc";
s = s + 1;
Log.e("foin--", s);//輸出結(jié)果為abc1
從上面的代碼中我們是明明改變了s的值施绎,為什么我們又說他是不可改變的對象?
其實這只是一種表象贞绳,JVM是這么解析這段代碼的谷醉,首先創(chuàng)建一個s對象,賦值abc冈闭,然后再創(chuàng)建一個新的s對象用來執(zhí)行第行代碼俱尼,在這個過程中,第一行代碼中的s對象并沒有發(fā)生改變萎攒,因此我們每次用String來操作字符串的時候遇八,實際上實在不斷創(chuàng)建新的對象,而原來的對象將會變成垃圾被GC回收耍休,由此可見用String來操作字符串效率之低不言而喻刃永!
StringBuffer和StringBuilder:
字符串變量,是可變的對象羹应,因此我們在用他們操作字符串的時候揽碘,實際上是一直在操作我們聲明的對象,就不會像String那樣產(chǎn)生額外的消耗,效率自然高了雳刺。
一個特殊的例子
Strings="Fanshuwei is"+"a"+"good boy!";
和
StringBuffersb=newStringBuffer("Fanshuwei is").append("a").append("good boy!");
在這種情況下劫灶,很多人會以為StringBuffer的效率會高于String的效率,其實不然掖桦,實際上String對象在此處的引用就相當(dāng)于
Strings="Fanshuwei is a good boy!";
因此StringBuffer不會比String快本昏,但是在以下這種情況下StringBuffer就會有明顯的優(yōu)勢
Strings1="Fanshuwei is";
Strings2="a";
Strings3="good boy";
Strings1=s1+s2+s3;
這時候JVM就會按照原來的方法去做。
StringBuffer和StringBuilder的區(qū)別
StringBuffer:線程安全
StringBuilder:線程不安全
當(dāng)我們的字符串緩沖區(qū)被多個線程使用時枪汪,JVM不能保證StringBuilder的線程是安全的涌穆,雖然它的速度最快,但是它可以保證StringBuffer是可以正確操作的雀久,我們大部分時候是在單線程中進行操作宿稀,所以更建議使用StringBuilder而不是StringBuffer,就因為StringBuilder的在單線程中效率最快赖捌。
總結(jié)
1.如果操作少量的數(shù)據(jù)用String祝沸;
2.單線程下操作大量數(shù)據(jù)用StringBuilder;
3.多線程下操作大量數(shù)據(jù)用StringBuffer越庇。