走进String的源码
1、String源码简单分析
主要成员属性
一个char类型的value数组和一个hash值
image.png
equals
判断逻辑先判断是否是同一个对象,判断类型为字符串,value的每一位都相等。
image.png
hashcode
hashcode默认为0,不为0则直接返回,为0则X31叠加。选择31一个不大不小的质数避免hash冲突
image.png
codePoint
image.pngUnicode的编码空间从U+0000到U+10FFFF
而java中的char默认为两个字节,利用辅助区间鉴别三个字节的高低补位的字符
UTF-16将保留下来的0xD800-0xDFFF区段的码位来对辅助平面的字符的码位进行编码
在0xD800-0xDFFF区间内的代码点由高低代理一起组成一个字符
0-0xFFFFF分为20位分为前10位和后10位值范围为0~0x3FF
高10位加上0xD800为高位代理值范围为0xD800~0xDBFF
低10位加上0xDC00为地位代理值范围为0xDC00~0xDFFF
高低代理的值区间刚好落在BMP区间内的0xD800-0xDFFF流出的辅助区间内,用于区别是两个字节还是三个字节的字符
image.png高低位代理计算方法
image.png
image.png判断字符是否为两个字符基础平面,判断是否在unicode编码区间内
2、知识点总结
1、Arrays.copyOfRange可以复制数组,native方法下载openjdk源码查看
2、Character.isBmpCodePoint,isValidCodePoint代码点unicode,正常两个字节。三个字节的通过辅助区别判断,高低位代理计算
3、StringCoding.decode中使用了ThreadLocal
4、equals ==,判断类型为字符串,value的每一位都相等。
5、hashcode默认为0,有则直接返回没有则X31叠加。选择一个不大不小的质数避免hash冲突
5、相关类StringBuffer,StringBuilder,Arrays,Character,StringCoding,Pattern