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。
时间: 2024-10-27 13:15:48