當前位置:
首頁 > 最新 > Chapter13-字元串

Chapter13-字元串

基本內容

  • 不可變的String

  • String中的+操作符

  • StringBuilder和StringBuffer

  • String在內存中的位置

1 不可變的String

String的對象是不可變的,如下:

在上述代碼中,實際上分別創建了abc和def兩個字元串,str只是由指向abc的引用變為指向def的引用。

我們來看下Java中String類的源代碼

我們可以看到,其實String類在Java內部是以final修飾的字元數組形式存儲的。這也就表明了,String只會初始化一次,並且不可被繼承。

我們通過源代碼再來看下對String進行分割,合併等操作後String是否會發生變化。

可以看出,其實在這些操作後都生成了新的字元串。

2 String中的+操作符

Java中是不允許程序員對操作符重載的,但是Java自身對+操作符進行了重載。

在String的操作中,+操作符表示字元串連接。

我們反編譯上述代碼

我只截取了反編譯後的部分內容。

可以看出在Java的內部實現中,+操作是以StringBuilder的形式實現的。

注意:

其實這個過程就是:

在String使用+連接字元串的時候,創建了很多String對象,這無疑會影響到效率。

3 StringBuilder和StringBuffer

使用StringBuilder/StringBuffer的意義無非就是為了提高操作字元串的效率。

我們先看下源碼中關於這兩個類的聲明。

都是繼承自抽象類AbstractStringBuilder,都熟悉點了Serializable和CharSequence介面。

其實不僅僅是類的聲明,StringBuilder/StringBuffer其實是在功能上是完全相同的,只是StringBuffer中的方法大多被synchronized修飾,因此是線程安全的,而其實不僅僅是類的聲明,StringBuilder不是線程安全的。

我們使用《Thinking in Java》中的例子來探究下StringBuiler是否真的能提升效率。

我們先提供兩個方法

我們反編譯後上述代碼

我們只保留兩個方法中的循環部分。

注意:

我們明白了這兩項以後就可以看出,String使用+連接字元串的時候,每次都會創建StringBuilder對象,而這肯定是會影響執行效率的。

最後,我想說一些關於StringBuilder和StringBuffer的實現原理的內容。

我們來看它們的父類AbstractStringBuilder的源代碼(只截取一部分)。

我們可以看到,AbstractStringBuilder內部也是以字元數組實現的。注意count是指實際長度,而capacity指的是容量,注意它們的區別。

以上是擴容的兩個方法,原理很簡單,大家可以自己思考下。還有個trimToSize()方法,是縮減容量的。

至於StringBuilder和StringBuffer所實現的方法,在這裡不多說,大家可以去看API進行學習。

4 String在內存中的位置

之前我在【CoreJava】equals()和==的比較中提到過String的存放位置,但只是稍微講了下關於兩種創建方式存儲位置的不同。

我們使用兩種種方式創建字元串

我們反編譯上面的代碼

可以看出兩種方式都是首先從字元創常量池中尋找abc,但是它們的區別在哪呢?

這就是我們為什麼推薦使用

字元串的內容也基本結束了,《Thinking in Java》中還補充了正則表達式和格式化輸出的一些內容。正則表達式可以作為一整篇文章來講,而且我自己目前也不太熟練,所以就不在這多說了。格式化輸出呢,我用的比較少,平時用的也不多,所以也沒有怎麼研究過。畢竟腦子有限,還是要有一些側重的。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

QQ群引流——暴利賺錢的基礎(上)

TAG:全球大搜羅 |