天天看點

JDK源碼閱讀(2):String類閱讀筆記

JDK源碼閱讀(2):String類閱讀筆記

JDK源碼閱讀:String類閱讀筆記

用于存儲String的字元。

<code>@Stable</code>注解表示變量最多被修改一次,稱為“穩定的”。

String的很多構造方法使用了數組或者其他一些集合來建立新的String,這些構造方法大多含有以下參數

集合S

取值左端點p

取值長度l

那麼需要一個方法來檢查這幾個參數是否合法,是以String類提供了<code>checkBoundsOffCount()</code>方法

如下是一個以bytes數組初始化String的例子,使用了上述方法。

同時,還有一個<code>checkBoundsBeginEnd()</code>方法

這個方法可以檢查begin、end以及length是否适配

這個常量用于表示是否支援字元串壓縮,預設為true。

在<code>coder()</code>方法内,要求傳回String的編碼,它是這樣實作的。

如果支援字元串壓縮,就正常傳回該字元串的coder,否則必須使用UTF16。

擷取value的長度,再根據字元集進行處理。

<code>coder()</code>的傳回結果如<code>LATIN1</code>、<code>UTF16</code>等都是位元組常量。

這個方法可以将String中的一部分轉化字元存到chars數組中。下面是一個簡單的使用示例。

輸出

當調用String的compareTo方法時,會根據字元串的編碼類型選擇不同類的靜态方法。而它們内部實作compare的算法都是類似的。下面給出一個例子。

String的哈希方法采用這個公式:$s[0]31^{(n-1)} + s[1]31^{(n-2)} + \cdots + s[n-1]$

下面是<code>StringLatin.hashCode()</code>

<code>replaceAll()</code>和<code>replaceFirst()</code>方法接受<code>regex</code>參數和<code>replacement</code>參數。<code>Pattern</code>類從調用<code>compile()</code>方法解析正規表達式<code>regex</code>傳回一個<code>Mathcher</code>,再調用它的<code>replaceAll()</code>或<code>replaceFirst()</code>方法。

String類中定義了LATIN1和UTF16兩個編碼格式

ISO Latin-1是8比特的字元集,定義了256個字元。前128個字元(00000000-01111111)與ASCII完全一緻。

是以使用LATIN1作為編碼格式時,往往要通過<code>&amp;0xff</code>的方式取低八位

UTF-16也是采用可變長度編碼,可以是一個或者兩個16比特。