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
对分割次数的限制。