首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

一文看懂HashMap扩容为什么是2的n

2.为什么扩容2的n? 首先先看一下HashMap中的putVal方法(存值的)和resize方法(扩容的),之所以HashMap扩容是2的n和这两个方法有千丝万缕的联系。...通过putVal方法可以看出来HashMap在存值时会先把key的hash值和扩容后的长度进行一按位与运算,其中hash是在hash方法中把key进行计算后的出来的结果,n是扩容的长度(也就是数组的长度...其中n是集合的容量,hash是添加的元素经过hash函数计算出来的hash值。...n-1也就是15,而15二进制则是1111扩容后为32-1及11111111 ,如果都为1的情况下是可以极大的减少hash碰撞,增加效率的。...通过上面的对比可以看出来11111111和其他值 比较大大的减少了hash碰撞的发生,这样就是为什 么HashMap为什么扩容采用2的n的原因。

6.1K90

restful 等性(什么是法则)

理解RESTful的等性,并且设计符合等规范的高质量RESTful API。 怎么理解等性 HTTP等方法,是指无论调用多少都不会有不同结果的 HTTP 方法。...不管你调用一,还是调用一百,一千,结果都是相同的。 还是以之前的博文的例子为例。...# 更新用户信息(部分字段) 【DELETE】 /users/1001 # 删除用户信息 HTTP GET方法 HTTP GET方法,用于获取资源,不管调用多少接口...我们来看下 【PUT】 /users/1001 # 更新用户信息(全部字段) 因为它直接把实体部分的数据替换到服务器的资源,我们多次调用它,只会产生一影响,但是有相同结果的...【DELETE】 /users/1001 # 删除用户信息 调用一和多次对资源产生影响是相同的,所以也满足等性。

46920

jdk源码分析之HashMap--为什么初始容量是2的n

其实就是两个数字的二进制数据对应的位对比,1&1=1,1&0=0,0&0=0,比如: 1011=11 1000=8 按位与之后 1000=8 回到我们的主题中,为什么初始容量(也就是Entry数组的长度)建议为2的n呢...我们举几个例子,length1=3(奇数),length2 = 6(偶数),length3 = 16(2的n),那么对应的length-1二进制数组如下: ?...从以上例子中可知,奇数和偶数(非2的n),和任何key的hashcode按位与操作,总会有一些位置覆盖不到。...回到上述的indexFor方法中,也就是说对于数组长度非2的n的情况,永远会有一些数组位置辐射不到,再换一个角度来说,这些场景中,我们永远无法将Entry数组利用率提高到100%。...数组利用率很低 get和put性能都很差 由于HashMap非线程安全,有链表的put操作触发resize导致死链的概率变大 最后我们可以得出结论,使用HashMap的时候建议指定的容量是2的n

36510

O(1)时间检测2的除以2统计1的位数nn-1取且

用 O(1) 时间检测整数 n 是否是 2 的。 样例 n=4,返回 true; n=5,返回 false. 除以2 这个当然是很简单也最容易想到,int的话可能要除31才能出来。...统计1的位数 这个也容易想到,如果是2的的话肯定是正的,然后去统计1的个数,需要移位和取且操作,和上面的方法差不多。因为除2本来就可以通过移位操作完成。...// write your code here } nn-1取且 这个是以前检测有多少个1的时候用到的一种方法,那个时候有一个结论:n&n-1可以减少一位1,如果用这种方法,那代码是相当简单:...n位有符号数的表示范围: -2^n-- 2^(n-1)-1 原码的表示:     左边是符号位,正数为0,负数为1。...在8位字中,我们的模就是2的8方,即256。

58630

为什么HashMap默认初始容量为2?不是2会怎样?讲讲 HashMap 扰动函数?

关于HashMap的详解文章请移步: 链接: HashMap源码研究——源码一行一行的注释 文章目录 为什么初始容量是 2? 如果指定了不是2的的容量会发生什么?...那容量不是 2会怎么样?我们来做个试验。...2的情况: 非2的情况,假设 n = 10: 对比来看,哪种发生哈希碰撞的概率更低一目了然,如果 n 为 2,可以保证数据的均匀插入,降低哈希冲突的概率,毕竟冲突越大,代表数组中的链表...如果指定了不是2的的容量会发生什么?...总结 总的来说,不管是规定 Hashmap 的 n 为 2,还是扰动函数,都是为了一个目标,降低哈希冲突的概率,从而使 HashMap 性能得到优化。

93721

论tcp的n握手和m挥手

[tcp状态机] 三握手 三握手的大致内容,甚至可以画成下图的漫画。 [三握手] 调侃归调侃,然而道理还是这么个道理。...,因为控制位跟我们的三握手四挥手有关系。...这个生成器会用一个32位长的时钟,差不多4µs增长一,因此ISN会在大约 4.55 小时循环一。...漫画图解如图所示 [三握手成功.png] [两握手1.png] [两握手2.png] 在前面的描述中我们知道发送方与接收方都会有自己的 ISN (下面的例子中就是 X 与 Y)来做双方互发通信,具体的描述如下...这种情况如果只需要 A 发送给 B ,B 无需回应,则可以不做三握手。 四挥手(Four-Way-Wavehand) 说完三握手,那另外的四挥手也是这样吗?为了妥协、为了排除异常情况吗?

56240

HashMap 容量为什么总是为 2 的

为什么要保证 capacity 是2的呢? 1)在get方法实现中,实际上是匹配链表中的 Node[] tab 中的数据。...2)因为 n 永远是2的,所以 n-1 通过 二进制表示,永远都是尾端以连续1的形式表示(00001111,00000011) 当(n - 1) 和 hash 做与运算时,会保留hash中 后 x...- 1) & hash,当n为2时,会满足一个公式:(n - 1) & hash = hash % n 2.为什么要通过 (n - 1) & hash 决定桶的索引呢?...0 : (h = key.hashCode()) ^ (h >>> 16); } 3.capacity 永远都是 2 ,那么如果我们指定 initialCapacity 不为 2时呢,是不是就破坏了这个规则...答案是:不会的,HashMap 的tableSizeFor方法做了处理,能保证n永远都是2

1.7K20
领券