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

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

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

6K90

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

用 O(1) 时间检测整数 n 是否是 2 。 样例 n=4,返回 true; n=5,返回 false. 除以2 这个当然是很简单也最容易想到,int的话可能要除31才能出来。...统计1位数 这个也容易想到,如果是2的话肯定是正,然后去统计1个数,需要移位和取且操作,和上面的方法差不多。因为除2本来就可以通过移位操作完成。...bool checkPowerOf2(int n) { if(n<=0) return false; return !...n位有符号数表示范围: -2^n-- 2^(n-1)-1 原码表示:     左边是符号位,正数为0,负数为1。...CPU加法器简单效率高,因此不需要再专门实现减法器。 在8位字中,我们模就是28方,即256。

58430

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

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

35810

HashMap 容量为什么总是为 2

为什么要保证 capacity 是2呢? 1)在get方法实现中,实际上是匹配链表中 Node[] tab 中数据。...2)因为 n 永远是2,所以 n-1 通过 二进制表示,永远都是尾端以连续1形式表示(00001111,00000011) 当(n - 1) 和 hash 做与运算时,会保留hash中 后 x...- 1) & hash,当n2时,会满足一个公式:(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 进制角度进行观察。...举例如下: 2 = 2 ^ 1 = 10 4 = 2 ^ 2 = 100 8 = 2 ^ 3 = 1000 16 = 2 ^ 4 = 10000 观察 2 进制可以看出,2 N...,直接返回 0,num 必须要大于 1,否则直接返回 1,因为当 num 等于 1 时要么是循环结束,要么 num 本身就是 1,如果是 1 的话,就是 2 0 。...就直接返回一个 0,如果循环中 num 最低位都不为 1,那么最后就返回 1 即可。整个过程其实很简单,如果不太明白,那么最简单方式就是将一个值转换为 2 进制,跟着调试一即可。

45720

Batch大小不一定是2n!ML资深学者最新结论

羿阁 编译整理 量子位 | 公众号 QbitAI Batch大小不一定是2n? 是否选择2n在运行速度上竟然也相差无几? 有没有感觉常识被颠覆?...在介绍他试验方法之前,首先来回顾一下这个惯例究竟是怎么来2n从何而来? 一个可能答案是:因为CPU和GPU内存架构都是由2n构成。...△由于GPU内存限制,无法使用大于515样本数量 可以看出,跟上一轮结果一样,不管样本数量是否是2n,训练速度差异几乎可以忽略不计。...正如我们看到2n(256)运行速度并不比255差太多。...结论 可以看出,选择2n或8倍数作为batch大小在实践中不会产生明显差异。 然而,由于在实际使用中已成为约定俗成,选择2n作为batch大小,的确可以帮助运算更简单并且易于管理。

46610

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

HashMap中数组长度为什么要设计成2?  了解本文前提需要你对数据结构有一定了解,明白各种数据结构优劣。当然如果你已经知道了HashMap底层数据结构是数组+链表+红黑树那就更好了。...for(int n : length){ System.out.println("--------------"+n+"-----------------");...for(int hash=0;hash<=100;hash++){ System.out.print((hash & n-1)+"\t"); }...我们从map中取数据时,本来可以直接通过key计算出槽位取出对应元素就可以了,现在因为这个槽位存放是一个链表,那么想要取数据还得遍历这个链表,在非常极端情况下(所有元素hashcode都是相同...这样就失去了数组随机查找效率高这样一个特性。 因此让数组长度等于二可以有效减少hash冲突概率。 HashMap还有许多特性,感兴趣的话可以参考JDK自己手写一个HashMap。

92520

常见算法时间复杂度 Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…

虽然我不懂算法,但是我知道关于算法时间复杂度。比如:Ο(1)、Ο(log2n)、Ο(n)、Ο(nlog2n)、Ο(n2)、Ο(n3)…Ο(2n)、Ο(n!)等所代表意思!...O(n^2) 就代表数据量增大 n 倍时,耗时增大 n 平方倍,这是比线性更高时间复杂度。比如冒泡排序,就是典型 O(n^2) 算法,对 n 个数排序,需要扫描 n × n 。...二分查找就是 O(logn)算法,每找一排除一半可能,256 个数据中查找只要找 8 就可以找到目标。 ?...常见时间复杂度有:常数阶 O(1),对数阶 O(log2n),线性阶 O(n),线性对数阶 O(nlog2n),平方阶 O(n2),立方阶 O(n3),…,k 次方阶 O(nk),指数阶 O(2n)...常见算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)。 ? 上图是常见算法时间复杂度举例。

7.7K21
领券