String 的使用及引申

一、String的源碼簡扒

String 類是 final 類,String的實現是依賴 char+數組,且數組(在內存中存儲位置是連續的)爲 final 類型(不可修改)。 所以,String 創建出來的對象不可修改。

順便一提,定義char變量的時候用單引號‘’,且字符長度爲1,如 char a= '';

二、String 的使用示例

補充:== 比較的是引用,equals比較的是值

示例1。此種方式創建的String字符,是從常量池裏獲取來的,str1使用的時候,常量池不存在,就創建此數據,str2使用的時候,常量池已存在該數據,直接引用。所以,兩者的內存地址和值都一樣。

示例2。如下方式,在常量池創建hello常量,堆裏創建兩個String對象。所以以下兩個對象,值相等,內存地址不相等。

示例3。對象str1是創建了常量池數據,一個在常量池,一個在堆裏,所以值相等,內存地址不相等。

示例4。字符串先拼接,後賦值,兩個對象的值和內存地址都一樣。

示例5。str1和str2在編譯的時候把常量創建出來,使用“+”號的時候,會創建一個新的對象出來,導致內存地址不一樣,值相等。

基於jdk1.8裏String拼接符 "+" 的講解截圖可知,使用+的時候,會通過StringBuffer或StringBuilder的append方法實現,然後toString(創建新對象)

如下StringBuilder的toString()方法

三、String對象的創建個數問題

四,String,StringBuffer,StringBuilder的區別

1,StringBuilder和StringBuffer的源碼中繼承類,實現接口完全一樣。且都更強調append和insert的使用。初始默認值都爲16,會自動對容器的大小進行擴容。執行toString()方法返回String對象。

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
public final class StringBuffer  extends AbstractStringBuilder implements java.io.Serializable, CharSequence

但是簡介上又有點不一樣。

2,StringBuilder強調單線程應用的時候會更快。如下源碼簡介

Where possible,it is recommended that this class be used in preference to {@code StringBuffer} as it will be faster under most implementations.

3,StringBuffer強調更安全。如源碼簡介 :String buffers are safe for use by multiple threads.

StringBuffer對象內的方法都有synchronized修飾,即同步代碼塊,保證同步。包含一個短暫的緩衝區,且意思爲無論StringBuffer何時修改,都會把最新的緩存值返回給tostring

4,對比。

String:創建後值不可變,少量或局部確定性變量情況下適用

StringBuilder:值可變,線程不安全,操作更快,適合單線程,未知數量下字符串拼接使用。

StringBuffer:值可變,線程安全,適合多線程,未知數量的字符串拼接使用。

附:速度問題,要具體問題具體分析,不能直接下結論。String確定性常量在編譯期會先生成,運行期會動態生成未確定的常量

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