java1.8中HashMap的源码为什么定义参数要使用这种方式,有什么好处?

影子殿下 2019-01-30 12:18:17
...全文
350 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
哈希塞特 2019-02-28
  • 打赏
  • 举报
回复
a & (b-1) = a % b 2的整数倍减1后正好二进制每个位都是1,使上面等式成立,元素分布最均匀
别闹腰不好 2019-02-26
  • 打赏
  • 举报
回复
那么问题来了,为什么hashMap 每次扩容都是2的次幂,并且是原来的2倍。
imiMi_ 2019-02-26
  • 打赏
  • 举报
回复
引用 8 楼 maradona1984 的回复:
[quote=引用 6 楼 imiMi_ 的回复:] 使用位运算计算速度快
引用 7 楼 bcsflilong 的回复:
这样快 位运算
位运算是快,但特么这是常量啊,你直接定义一个值岂不是更快? 我倒是觉得这个数是2的多少次方,这样写其实更便于理解程序表达的含义,而不是给一个确定的数字,反而不便于理解[/quote] 直接定义一个值完全可以,只是可能会让看源码的人一脸懵逼。 我觉得写源码的人没有这么做纯粹是为了突出map容量必须是2的n次幂这一个特点。扩容边界也是一样,完全可以写成12,但源码在初始化时却写成capacity * loadFactor,是为了可读性而没有去直接定义一个值。
imiMi_ 2019-02-21
  • 打赏
  • 举报
回复
使用位运算计算速度快
maradona1984 2019-02-21
  • 打赏
  • 举报
回复
引用 6 楼 imiMi_ 的回复:
使用位运算计算速度快



引用 7 楼 bcsflilong 的回复:
这样快 位运算


位运算是快,但特么这是常量啊,你直接定义一个值岂不是更快?
我倒是觉得这个数是2的多少次方,这样写其实更便于理解程序表达的含义,而不是给一个确定的数字,反而不便于理解
bcsflilong 2019-02-21
  • 打赏
  • 举报
回复
这样快 位运算
影子殿下 2019-01-30
  • 打赏
  • 举报
回复
    /**
* The default initial capacity - MUST be a power of two.
*/
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

/**
* The maximum capacity, used if a higher value is implicitly specified
* by either of the constructors with arguments.
* MUST be a power of two <= 1<<30.
*/
static final int MAXIMUM_CAPACITY = 1 << 30;
影子殿下 2019-01-30
  • 打赏
  • 举报
回复
podd 2019-01-30
  • 打赏
  • 举报
回复
你可以读他英文的注释
podd 2019-01-30
  • 打赏
  • 举报
回复
1<<4 = 1*2^4 规定了必须是2的幂

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧