首页 > 常见问答

hashmap怎么扩容 为什么HashMap的数组长度一定是2的次幂?

为什么hashmap的数组长度一定是2的次幂?

有两个原因

1。为了查找和添加元素,模块化操作用于查找数组下标。如果模运算是2的n次方,则可以用位运算符代替,这样效率更高。

2.扩容方便。

如果直接查看源代码,可以看到扩展的resize方法的参数是2*表.长度(图中是jdk7的源代码),也就是说每次扩容都是容量的两倍,扩容后需要进行数据迁移。如果初始长度为2的n次方,则扩展将减少数据迁移的次数。

hashmap怎么扩容 为什么HashMap的数组长度一定是2的次幂?

例如,初始长度为16,将扩展到32。位置1中的节点仅在扩展后迁移到位置1和17。实际上,i位置的节点只会迁移到i之前和i扩展之后的数组长度。

例如,当数组的长度为16时,它位于1的位置。当它扩展到32时,它会被移到17的位置

例如,当数组的长度为16时,它就在1的位置。当它扩展到32时,它仍然处于1的位置。

这是主要原因。

顺便说一下,在源代码中,如果您不将其设置为2的n次方,它也将帮助您将其设置为2的n次方。例如,如果通过15,它将帮助您将其设置为16。源代码的对应方法是2的整数倍。

希望对您有所帮助。你可以跟我分享一些关于源代码的想法

1。hashmap支持null键和null值;hashtable不允许。这是因为hashmap对null有特殊处理。它将hashcode值null设置为0,并将其存储在哈希表的第0个bucket中。

2.hashmap是非线程安全的,hashmap的线程安全方法是mapmap=集合.synchronziedmap(newhashmap());哈希表是线程安全的

3。hashmap的默认长度是16,扩展是原来的两倍;hashtable的默认长度是11,扩展是原来的2n1。hashmap继承abstractmap;hashtable继承dictionary

4。扩展名,hashmapcomparisonconcurrenthashmap,hashmapcomparisonsparsearray,linkedarrayvsarraylist,arraylistvsvector

长度2的n次方,可通过位运算h&(长度-1)获得模运算,所以效率最高

map在计算添加元素的位置时使用位运算,效率特别高。另外,hashmap的初始容量是2的n次方,扩展也是2倍,因为容量是2的n次方,可以使添加的元素均匀分布在hashmap数组中,减少哈希冲突,避免链表结构的形成,降低查询效率。

hashtable和hashmap区别?

就是这么说的。。。

没有容量扩展的示例:

如果10个存储桶中有1w数据,并且每个存储桶平均有1000个数据,那么即使jdk8中默认有8个以上的存储桶,它也会将您变成一棵红黑树,那么您查找元素的平均时间是log(base2)1000。

另一方面,如果扩容。过程同上,但平均时间会大大缩短。

还有谁说12个会扩大?这只是默认值。

jdk文档明确建议在初始化hashmap时,应根据将来存储的数据量一次性指定其容量和负载因子。尽量避免扩展(这将导致额外的成本),同时,它不应该浪费内存

你好,我很高兴回答你的问题。

如果你是某个单位的公职人员,你的亲戚朋友经常来找你打听单位的内部事务。如果你有什么事需要你帮忙,你应该怎么处理?][真题]爱狗协会人士反映,最近他们用200条狗堵了一辆车,网上批评刘胡兰、邱少云、琅琊山五杰等中国抗日英雄的言论很多。你觉得这个怎么样?]【真题】近年来,释放积德的行为层出不穷,但最近有人放生老鼠。你怎么认为?

面试题还有很多其他意思,小编不会一一列出,如果你有兴趣,可以去sd.offcn.com网站学习。

hashmap怎么扩容hashmap为什么扩容2倍hashmap扩容过程

原文标题:hashmap怎么扩容 为什么HashMap的数组长度一定是2的次幂?,如若转载,请注明出处:https://www.saibowen.com/wenda/24136.html
免责声明:此资讯系转载自合作媒体或互联网其它网站,「赛伯温」登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,文章内容仅供参考。