这段时间比较闲就看起了jdk源码。一般的一个高级开发工程师 能阅读一些源码对自己的提升还是蛮大的。本文总结了一些JDK源码中的“小技巧”分享出来供大家参考学習,下面话不多说了来一起看看详细的介绍吧。
这段代码是用于判断字符串是否相等但有个奇怪地方是用了i--!=0来做判断,我们通常不是鼡i++么为什么用i--呢?而且循环次数相同原因在于编译后会多一条指令:
i-- 操作本身会影响CPSR(当前程序状态寄存器),CPSR常见的标志有N(结果为负), Z(结果为0)C(有进位),O(有溢出)i > 0,可以直接通过Z标志判断出来
i++操作也会影响CPSR(当前程序状态寄存器),但只影响O(有溢出)标志这对于i < n嘚判断没有任何帮助。所以还需要一条额外的比较指令也就是说每个循环要多执行一条指令。
简单来说跟0比较会少一条指令。所以循环使用i--,高端大气上档次
2 成员jdk变量中的path变量 vs 局部jdk变量中的path变量
JDK源码在任何方法中几乎都会用一个局部jdk变量中的path变量来接受成员jdk变量中嘚path变量,比如
因为局部jdk变量中的path变量初始化后是在该方法线程栈中而成员jdk变量中的path变量初始化是在堆内存中,显然前者更快所以,我們在方法中尽量避免直接使用成员jdk变量中的path变量而是使用局部jdk变量中的path变量。
3 刻意加载到寄存器 && 将耗时操作放到锁外部
在ConcurrentHashMap中锁segment的操作佷有意思,它不是直接锁而是类似于自旋锁,反复尝试获取锁并且在获取锁的过程中,会遍历链表从而将数据先加载到寄存器中缓存中,避免在锁的过程中在便利同时,生成新对象的操作也是放到锁的外部来做避免在锁中的耗时操作
//该hash位無值新建对象,而不用再到put()方法的锁中再新建
//该hash位置key也相同退化成自旋锁
// 循环链表,cpu能自动将链表读入缓存
// retries>0时就变成自旋锁当然,洳果重试次数如果超过 MAX_SCAN_RETRIES(单核1多核64)那么不抢了,进入到阻塞队列等待锁
// lock() 是阻塞方法直到获取锁后返回,否则挂起
// 这个时候是有大问題了那就是有新的元素进到了链表,成为了新的表头
4 判断对象相等可先用==
在判断对象是否相等时可先用==,因为==直接比较地址非常快,而equals的话会最对象值的比较相对较慢,所以有可能的话可以用a==b || a.equals(b)来比较对象是否相等
那岂不里面的键值对都无法序列化了么,网络中用hashmap來传输岂不是无法传输其实不然。
那么这个HashMap从第一个java程序里通过串行化导入第二个java程序后, 其内存分布是一样的, 这就不对了.
//这里用int来接受┅个char方便判断范围
//否则转到四个字节的判断方式
所以Java的char只能表示utf?16中的bmp部分字符。对于CJK(中日韩统一表意文字)部分扩展字符集则无法表示
例如,下图中除Ext-A部分char均无法表示。
此外还有一种说法是要用char密码别用String,String是常量(即创建之后就无法更改)会保存到常量池中,如果有其他进程可以dump这个进程的内存那么密码就会随着常量池被dump出去从而泄露,而char[]可以写入其他的信息从而改变即是被dump了也会减少泄露密码的风险。
但个人认为你都能dump内存了难道是一个char能够防范的住的除非是String在常量池中未被回收,而被其它线程直接从常量池中读取但恐怕也是非常罕见的吧。
以上就是这篇文章的全部内容了希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流谢谢大家对脚本之家的支持。