JDK 源码 阅读

来源:互联网 发布:企业员工培训软件 编辑:程序博客网 时间:2024/05/16 14:32

To be continuing....... 

持续修改中。。。。


1. StringBuffer

所处类层次


易忽略点:

- 这个类是线程安全的。 所有的method直接或间接加synchronized。 所以我们如果是单线程情况下也考虑到这个会不会影响到效率。当然可能JIT可以进行这个优化,待我接下来验证。

- 默认情况下一个长为16个字符的数组被创建来存储字符串。


相关学习点:

- 当我们把Long, Integer 加到其中时。我们要先技术这个数字要多少个字符来存放。 这里的小技巧即使 用正数来求,负数加一。在求正数时,从1位开始比较1位必定小于10,接下来2位的必定小于100,以此类推。在计算integer要占的字符数时,边界值是直接缓存于数组中的。


2. Integer/Long

相关学习点:

- 在 Long 的package 方法getChars中有一整数乘法的为计算转化。   例如 a * 100 可以转化为 (a<<6) + (a<<5) + (a<<2) 。 原因就是 100的二进制为 1100100 。

- 在小于65536(10000 0000 0000 0000)的整数除10的整数运算中。我们可以把这个运算转换为快速的位运算。 a/10(整数运算)  --->  (a * 52429) >>> (16+3)。 这里 1<< 19 = 524288.   52429/524288 = 0.10000038146972...   说到这就明白了。  但还是有一点是为什么选择19,不是20也不是18. 原因是 52429 < 65536 ,  所以a 是16位内的数 52429乘上后不会越过整型的正数的界。同时取小于19的值 计算精度会低于取19。


0 0