這個問題,在現在的面試中,筆試中經常遇到,這個問題可能很多人都能回答,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爲什麼是不可變的?
內存效率。
字符串重複的概率很高,
當其不可變時,就可以多個變量共享了。