加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Java还在纠结原码、补码和反码?其实So Easy

发布时间:2019-07-18 04:36:47 所属栏目:建站 来源:BigDataKer 关注
导读:平常看jdk源码的时候有很大的感触,就是基础真的很重要,那什么是基础呢?除了java的基本语法之外,最基础的莫过于原码,反码和补码了以及基本的运算了! 1.原码、反码和补码 大家应该都知道,数据在计算机中是以二进制的形式存在的,比如 byte a = 6; byte

我们就比如传入5,那么n等于4,无符号右移一位然后与n进行“或”操作,由于位数太多,我就直接写结果了:

  1. 00000000 00000000 00000000 00000100//n的二进制补码 
  2. 00000000 00000000 00000000 00000110//无符号右移一位然后和n进行“或”操作 
  3. 00000000 00000000 00000000 00000111//无符号右移两位然后和n进行“或”操作 
  4. 00000000 00000000 00000000 00000111//无符号右移四位然后和n进行“或”操作 
  5. 00000000 00000000 00000000 00000111//无符号右移八位然后和n进行“或”操作 
  6. 00000000 00000000 00000000 00000111//无符号右移十六位然后和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中的那个数组中,我这里也就是简单提了一下,很容易的!

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读