频繁fullgc如何处理 hashmap在,扩容,时为什么是乘以2?
hashmap在,扩容,时为什么是乘以2?模运算可通过位运算H&(长度-1)获得,这是计算添加元素位置时最有效的位运算。这是一个特别有效的操作。另外,HashMap的初始容量是2的n次方,扩展也
hashmap在,扩容,时为什么是乘以2?
模运算可通过位运算H&(长度-1)获得,这是计算添加元素位置时最有效的位运算。这是一个特别有效的操作。另外,HashMap的初始容量是2的n次方,扩展也是2倍。由于容量是2的n次方,因此可以将添加的元素平均分配到HashMap中的数组上,减少哈希冲突,避免链表结构的形成,降低了查询效率。
map扩容为什么是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的整数倍。
希望对您有所帮助。你可以跟我分享一些关于源代码的知识
HashMap使用一个名为table的数组和几个名为entry的链表。查看HashMap如何应用这些数据结构。例如,HashMap将首先通过键获取其hashcode,然后更改键的hashcode%表.长度,即取hashcode模块表数组大小
1,存储方法:HashMap在Java中以键值对的形式存储元素。2、 调用原则:HashMap需要一个hash函数,该函数使用hashcode()和equals()方法向集合中添加和检索元素。调用put()方法时,HashMap计算密钥的哈希值,并将密钥-值对存储在集合中相应的索引中。如果键已存在,则该值将更新为新值。3、 其他热点特性:HashMap的一些重要特性是容量、负载因子和阈值调整。
HashMap实现了map接口,主要为客户提供三种数据显示方式:只查看键列表;只查看值列表;或者以键值形式成对查看数据。map接口没有定义如何存储数据,也没有指定如何确定键是否相同。因此,并非所有map实现都与hashcode方法相关。例如,treemap要求对象实现comparator接口,并通过其compare方法(而不是hashcode和equals)比较两者是否一致。同样,如果我们自己实现map接口,也可以直接用数组来存储数据,用==来判断键值是否一致,这样仍然可以完全满足map接口的定义。