2016 - 2024

感恩一路有你

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

浏览量:1924 时间:2021-03-11 12:30:56 作者:admin

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

有两个原因

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

2. 扩容方便。

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

例如,初始长度为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的线程安全方法是map map=集合.synchronziedMap(New HashMap());哈希表是线程安全的

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

4。扩展,HashMap comparison Concurrent HashMap,HashMap vs.sparse,linkedarray vs.ArrayList,ArrayList vs.vector

可以直接运行。。。publicstaticvoidmain(String[]args){HashMap<String,Integer>hm=newHashMap<String,Integer>()嗯,普特(“Jack1”,newInteger(1000))嗯,普特(“Jack2”,newInteger(2000))嗯,普特(“Jack3”,newInteger(3000))嗯,普特(“Jack4”,newInteger(4000))Integerlist[]=newInteger[hm.尺寸()]//数组长度与收藏。。充满活力。对于(I),inti=0ntegerstr:hm.值()){list[i]=stri=1}(intj=0j<list.lengthj长度){ 系统输出打印(列表[j])}

hashmap的数组存的是什么 hashmap初始化数组长度 hashmap初始化大小多少合适

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。