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

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

LeetCode | 2

LeetCode 题库第 231 题 —— 2 ? 这题也是比较容易一题,前提是找到规律即可。...如果从 10 进制角度观察 2 次方,可能并不容易发现规律,那么可以从 2 进制角度进行观察。...次方只有 1 个 1,其余都是 0,那么判断一个数是否为 2 ,可以通过位移来进行判断。...,直接返回 0,num 必须要大于 1,否则直接返回 1,因为当 num 等于 1 时要么是循环结束,要么 num 本身就是 1,如果是 1 的话,就是 2 0 。...就直接返回一个 0,如果循环中 num 最低位都不为 1,那么最后就返回 1 即可。整个过程其实很简单,如果不太明白,那么最简单方式就是将一个值转换为 2 进制,跟着调试一即可。

45620

HashMap中数组长度为什么要设计成2?

HashMap中数组长度为什么要设计成2?  了解本文前提需要你对数据结构有一定了解,明白各种数据结构优劣。当然如果你已经知道了HashMap底层数据结构是数组+链表+红黑树那就更好了。...如果你还知道hashMap默认初始化数组长度是16,且每次扩容都扩容为原长度两倍,那么我只能说“你已经是一个合格大佬了”。  ...,想要了解小伙伴可以自行baidu 下面这个程序简单模拟了,当数组长度分别为15、16时,添加100个元素所计算出下标位置。...我们从map中取数据时,本来可以直接通过key计算出槽位取出对应元素就可以了,现在因为这个槽位存放是一个链表,那么想要取数据还得遍历这个链表,在非常极端情况下(所有元素hashcode都是相同...这样就失去了数组随机查找效率高这样一个特性。 因此让数组长度等于二可以有效减少hash冲突概率。 HashMap还有许多特性,感兴趣的话可以参考JDK自己手写一个HashMap。

92320

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

如果存放相同Key,那么Value将会被覆盖,类似于QQ更改密码,账号不会变,只有密码会进行更改。 ? 运行结果如下所示 ? 2.为什么扩容2n?...首先先看一下HashMap中putVal方法(存值)和resize方法(扩容),之所以HashMap扩容是2n和这两个方法有千丝万缕联系。...通过putVal方法可以看出来HashMap在存值时会先把keyhash值和扩容后长度进行一按位与运算,其中hash是在hash方法中把key进行计算后出来结果,n是扩容长度(也就是数组长度...再看一下当容量不为11111111而是为其他值时候,通过下面的结果可以看出,1、2、4跟不同值进行hash运算但是结果却是相同,也就是发生了hash碰撞。 ?...通过上面的对比可以看出来11111111和其他值 比较大大减少了hash碰撞发生,这样就是为什 么HashMap为什么扩容采用2n原因。

6K90

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

数组长度)建议为2n呢?...我们举几个例子,length1=3(奇数),length2 = 6(偶数),length3 = 16(2n),那么对应length-1二进制数组如下: ?...从以上例子中可知,奇数和偶数(非2n),和任何keyhashcode按位与操作,总会有一些位置覆盖不到。...回到上述indexFor方法中,也就是说对于数组长度非2n情况,永远会有一些数组位置辐射不到,再换一个角度来说,这些场景中,我们永远无法将Entry数组利用率提高到100%。...最后我们可以得出结论,使用HashMap时候建议指定容量是2n(很多人习惯使用空构造器,默认容量16已经满足需求),具体还需要考虑业务场景而定。

35710
领券