【引言】String,在我们日常开发过程中,想必也是最常用到的一种类型,所以,这次的畅读源码系列的第一站就选择来读一读String这个我们熟悉但可能有些地方还很陌生的类吧!
声明
本系列的源码解读,也只是针对个人觉得比较重要的部分进行基本解读和分析,不可能对整个源代码包的所有文件面面俱到,所以只对有必要分析的部分加一些个人见解,非必要的部分在文中不做任何体现。
类的定义
String
1 | /** |
CharSequence
1 | /** |
成员变量
1 | /** |
构造方法
1 | /** |
常用方法
charAt
1 | /** |
compareTo
1 | /** |
concat
1 | /** |
contains & indexOf
1 | /** |
startsWith & endsWith
1 | /** |
length
1 | /** |
replace
1 | /** |
hashCode
之所以使用 31, 是因为他是一个奇素数。如果乘数是偶数,并且乘法溢出的话,信息就会丢失,因为与2相乘等价于移位运算(低位补0)。使用素数的好处并不很明显,但是习惯上使用素数来计算散列结果。 31 有个很好的性能,即用移位和减法来代替乘法,可以得到更好的性能: 31 * i == (i << 5) - i, 现代的 VM 可以自动完成这种优化。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/**
* 【Lin.C】:一个涉及到equals和散列的方法;使用 String 的 char 数组的数字每次乘以 31 再叠加最后返回
* 因此,每个不同的字符串,返回的 hashCode 肯定不一样
*/
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
substring
1 | /** |
trim
1 | /** |