走进String的源码

2018-10-25  本文已影响1人  huangxiongbiao

1、String源码简单分析

主要成员属性

一个char类型的value数组和一个hash值


image.png
equals

判断逻辑先判断是否是同一个对象,判断类型为字符串,value的每一位都相等。


image.png
hashcode

hashcode默认为0,不为0则直接返回,为0则X31叠加。选择31一个不大不小的质数避免hash冲突


image.png
codePoint

Unicode的编码空间从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编码区间内

image.png

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

上一篇下一篇

猜你喜欢

热点阅读