String,StringBuffer, StringBuilder 的區別到底是什麼?

這個問題,在現在的面試中,筆試中經常遇到,這個問題可能很多人都能回答,String是不可變的,StringBuffer和StringBuilder是可變的,在有大量的字符串操作時使用StringBuffer或者StringBuilder,StringBuffer相對於StringBuilder是線程安全的。這樣的回答是沒有錯的。很多java面試寶典上的答案都是這麼一句答案,這麼答也沒錯。至於缺少點什麼我也不知道,但是總覺得缺少點什麼。以前去參加面試時面試官也問過我這麼一個問題,不過別人好像對我說的答案不太滿意。好吧,估計是沒有說到重點吧,扯遠了。

我們都知道String是一個final類,至於StringBuffer和StringBuilder類呢,其實他們也是一個final類

String.class

public final class String implements java.io.Serializable, Comparable<String>, CharSequence

StringBuffer.class

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence
其實這三個類裏的真正值是一個char[]數組,String裏面的char[]數組是final類型,一旦被指定了,就不能更改了,且String還沒有對char[]操作的方法

但是另外兩個類的char[]數組沒有被定義爲final,雖然他們本身是final類,他們定義的變量不能指向其它對象,但是他們本身char[]是可以改變的。並且他們自身也提供了對char[]的操作。

char[]長度不夠時,調用了Arrays.copyOf(value, newCapacity);最終還是調用了System.arraycopy

如果用String來進行字符串的連接,那麼會創建出很多的對象。特別是在大循環裏對字符串直接使用+來進行連接,如果使用StringBuffer或者StringBuffer來進行字符串的拼接,使用append方法,對其操作即直接操作對象指向的引用,沒有建立過多的對象,底層都是對char[]的操作

以上都是在不涉及到反射。




String爲什麼是不可變的?

內存效率。
字符串重複的概率很高,
當其不可變時,就可以多個變量共享了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章