Java还在纠结原码、补码和反码?其实So Easy
我们就比如传入5,那么n等于4,无符号右移一位然后与n进行“或”操作,由于位数太多,我就直接写结果了:
最后右移16位的n结果应该是7,再到return语句,返回的是n+1,也就是返回8,而8就是2^3,满足前面说的返回一个2的次幂数;有兴趣的可以试试其他的数,返回的结果肯定是2的次幂数,有没有觉得这个算法特别牛逼!简直无敌呀! 如果你看懂了这个方法的话,你可以打开你的Eclipse或者IDEA,用jdk1.8找到一个叫做HashMap的类,你就可以看到这个方法(当然我把最后的return语句稍微变了一点),这个就是HashMap进行扩容的一个方法,所以我们可以知道HashMap初始化以及扩容之后的容量,总是2的幂级数,是不是很容易啊! 当然有的时候面试,面试官会问你为什么HashMap的容量要设置为2的幂级数啊?这个问题就有点东西了,首先你可以把这部分算法给他说一下,玛德!源码就是这样写的啊!你还问我为什么?然后还要说的话,其实也很容易,还涉及到了一个“与”操作,看看这个(n - 1) & hash,hash就是将一个键值对的key通过hash算法得到的一个很大的数,而n就是hashmap长度,也就是2的次幂数,那么(n - 1) & hash代表什么呢? 有兴趣的可以玩一下,其实就是相当于hash%n,就是相当于对n取余,这个余数肯定是小于n,这样首先可以保证得到的数组中的索引不会超过数组,而且用这种方式可以保证数据是均匀的分布在hashmap中的那个数组中,我这里也就是简单提了一下,很容易的!
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |