OpenJDK 源代码阅读之 String
概要
- 类继承关系
| 
 | 
 | 
- 定义
| 
 | 
 | 
- 要点
一旦创建就不可改变
实现
- storage
| 
 | 
 | 
可以看出 String 中的数据是如何存储的。
- 初始化
| 
 | 
 | 
可以看出使用 String 类型初始化,新 String 实际上与原来的 String 指向同一块内存。
| 
 | 
 | 
如果用 char[] 初始化,可以看出,新分配了内存,并复制,保证了两者相互独立,只是内容相同。
| 
 | 
 | 
注意用 StringBuffer 初始化时,对同一 buffer 是线程安全的,即初始化 String 的过程中,其它线程不会改变 buffer 的内容。
另外,能告诉我下面这段代码是怎么回事么?
| 
 | 
 | 
为啥这次不同步了呢?
- equals
| 
 | 
 | 
注意:
1) 检查类型
2) value 直接通过点访问了,value 是 private 的啊,怎么能这样?
- hashCode
| 
 | 
 | 
String 的 hashCode 公式:
s[0]*31^(n-1) + s[1]*31^(n-2) + … + s[n-1]
- replace
| 
 | 
 | 
从中可以看出,虽然说是 replace,但是实际上还是新生成了 buf ,然后再生成新的 String,而不是在原来的 value 上修改。如果有大量的替换,还是自己实现比较好诶~
- indexOf
| 
 | 
 | 
这段代码从 source 中寻找 target 第一次出现的位置,for 循环每次都先让 i 停留在一个位置,此位置上内容与 target 首字符相同,然后开始遍历。可以看出这是一个 O(n^2) 的算法,所以,标准库也不一定是最高效的,要是要高效,还是需要自己实现,或者找其它库的。
- matches
| 
 | 
 | 
正则表达式匹配函数。可以看出,是直接调用了 Pattern 中的相应函数。
| 
 | 
 | 
按 regex 将字符串分割,思路是如果是单个字符,或者转义字符,就手工分割,否则就直接调用 Pattern.comile(regex).split 函数。手工分割时每次都将 [off, next] 之间的内容加入 list,最后将 剩余的 [off, ]  加入。另外注意 limit 对分割次数的限制。