String源码学习
零散的收获
- 数组的元素类型可以通过getComponentType来获取到
- 子类型的数组可以赋值给父类型的数组,。但是并不存在继承关系。数组的父类是Object。
-
通过声明如下代码来控制需要序列化的field
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
-
Java中的char都是以unicode编码来保存字符的,占用2个字节。
- might be near -1>>>1. 这句话的意思是,可能会达到Interge.Max_Value,为什么呢? -1的二进制表示是全1.那么>>>之后,就变成了最高位为0,其他全为1,也就是int所表示的最大整数了。此时对这个数字做加法可能会溢出,所以会将a + b > c表示成 a > c - b,就不会有溢出问题了。
- Matcher.quoteReplacement方法将输入的字符串转换为其对应的字面值,其实就是讲输入参数中的和$都替换为两个,也就等同于字面值了。
常用方法
-
concat
将两个字符串连接为一个,通过调用两次System.arrayCopy来高效完成,第一次生成一个包含两个string长度的字符数组并将自身拷贝进去,然后将第二个string拷贝到剩下的部分中。
-
replace(char,char)
replace的实现可以很简单,先直接复制一个,然后逐个替换掉出现的字符即可。但是作者并没有这么实现,而是充分考虑了性能。
- 如果两个输入字符相同,那么直接返回自身即可。
- 如果待替换的字符没有出现,那么直接返回自身即可。
基于上面的两个考虑,实现先判断了两个入参是否相同,如果不同,那么先尝试去寻找这个待替换的字符串,如果找到了,这时才会new一个新的字符数组将内容拷贝过去。
不得不说,对性能的敏锐和态度,很能看出一个程序员的水准。
-
match
输入一个正则表达式,判断是否和这个字符串匹配。
-
replaceAll
将字符串中所有匹配输入正则表达式的部分替换为第二个参数
-
split
根据给定的序列将字符串分割,可以指定最多分割多少份。
-
format
类似C语言的格式化语法,参考java.util.Formatter
-
valueOf
return (obj == null) ? "null" : obj.toString();