天天看点

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比特。