浅析hashCode
写此文的起因是看到一个面试题:默认hashCode()返回的值是什么?GC后hashCode会改变吗? 在以前的认知里,默认hashCode()的返回值是java对象的内存地址没错。然而这又是一个经不起推敲的结论。 首先把一个对象作为key存入hashmap,如果hashCode返回内存地址,那么GC后地址必然改变,那么用这个对象就取不到值了,这显然是不合理的。 不知为何这样的谬误会存在脑子里这么久,从来没有怀疑过它。 既然想到这里,就再简单剖析一下hashCode原理吧。 1、预备知识 1.1 safepoint GC相关。VM线程触发GC时,需要先 stop-the-world ,说人话就是设置一个safepoint。工作线程会时不时检查safepoint状态,一旦发现safepoint被设置就将自己挂起。VM线程发现工作线程都挂起以后就执行GC,完事后再唤醒工作线程。 用现实情况举例就是:leader在群里发了一条"一会儿开会"的消息(safepoint),每个成员时不时查看消息,看到消息第一时间放下手中工作前往会议室(线程挂起),然而有个人沉浸编码无法自拔,十分钟后才看到信息,结果导致会议延迟(GC期间程序暂停时间过长) 至于底层具体如何实现,呃,我没看懂,感兴趣的同学自行了解 https://www.jianshu.com/p/c79c5e02ebe6 1.2 Mark