HashMap扩容机制

HashMap扩容机制想要了解HashMap的扩容机制你要有这两个问题1.什么时候才需要扩容2.HashMap的扩容是什么1.什么时候才需要扩容当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中的元素个数超过16×0.75=12(这个值就是阈值或者边界值threshold值)的时候,就把数组的大小扩展

大家好,又见面了,我是你们的朋友全栈君。

想要了解HashMap的扩容机制你要有这两个问题

  • 1.什么时候才需要扩容
  • 2.HashMap的扩容是什么

1.什么时候才需要扩容

当HashMap中的元素个数超过数组大小(数组长度)*loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值(DEFAULT_LOAD_FACTOR)是0.75,这是一个折中的取值。也就是说,默认情况下,数组大小为16,那么当HashMap中的元素个数超过16×0.75=12(这个值就是阈值或者边界值threshold值)的时候,就把数组的大小扩展为2×16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预知元素的个数能够有效的提高HashMap的性能。

补充:

当HashMap中的其中一个链表的对象个数如果达到了8个,此时如果数组长度没有达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链表会变成红黑树,节点类型由Node变成TreeNode类型。当然,如果映射关系被移除后,下次执行resize方法时判断树的节点个数低于6,也会再把树转换为链表。

2.HashMap的扩容是什么

进行扩容,会伴随着一次重新hash分配,并且会遍历hash表中所有的元素,是非常耗时的。在编写程序中,要尽量避免resize。

HashMap在进行扩容时,使用的rehash方式非常巧妙,因为每次扩容都是翻倍,与原来计算的 (n-1)&hash的结果相比,只是多了一个bit位,所以节点要么就在原来的位置,要么就被分配到”原位置+旧容量”这个位置。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147910.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • jboss安装与配置_andrax安装出错

    jboss安装与配置_andrax安装出错一.              下载与安装JBoss在本文中,我们下载的JBoss版本为:4.2.1.GA。下载地址:http://www.jboss.org/jbossas/downloads/在如上的下载页中下载JBoss-4.2.1.GA.zip文件。下载完成后,将其解压缩后即可完成安装,解压缩后将其放置到一个不带空格的目录(若目录带有空格,例如:C:

  • php用空格分隔字符串,分割字符串空格[通俗易懂]

    php用空格分隔字符串,分割字符串空格[通俗易懂]【java易错点】javasplit分割字符串空格问题解析Strings=”@123.com”;String[]data=s.split(“@”);//以@分割字符串,获得@后的值。运行结果如下data[0]:””;data[1]:123.com;此时,你会发现,data数组里面存储的第一个元素是一个空格…文章落雨_2012-02-14832浏览量python…

  • Spring Cloud Bus中的事件的订阅与发布(二)

    Spring Cloud Bus中的事件的订阅与发布(二)

  • maven安装及配置(详细版)

    maven安装及配置(详细版)1.下载:方式一可以从官方下载,下载页面:http://maven.apache.org/download.cgi方式二:或者题主提供的版本下载maven安装包提取码:ysns下载好后是一个压缩文件2.安装:maven压缩包解压到一个没有中文,空格或其他特殊字符的文件夹内即可使用。3.配置MAVEN_HOMEmaven的使用是在jdk的基础上,所以电脑必须有jdk第一步:新增环境变量:MAVEN_HOME第二步:在path环境变量中添加:%MAVEN_HOME%\bin

  • mysql decimal 实现_mysql decimal数据类型转换的实现「建议收藏」

    mysql decimal 实现_mysql decimal数据类型转换的实现「建议收藏」最近在工作遇到数据库中存的数据类型是:decimal(14,4)遇到的问题是:当我使用python读取到内存中时,总是带着decimal字符,再写入其它mysql表中时,数据类型为int型,导致数据入库不成功.importpymysql#创建数据库连接con=pymysql.connect()sql=”’selectcreated_timefromschma.tableLI…

  • 更改nginx默认端口_nginx查看端口

    更改nginx默认端口_nginx查看端口1、进入nginx.conf文件2、修改listen后的默认端口号改为想改的端口号(如下图)3、设置防火墙允许通过修改的端口号1、firewall-cmd–zone=public–add-port=90/tcp–permanent2、firewall-cmd–reload3、firewall-cmd–query-port=90/tcp4、在基于CentOS或RHEL的Linux发行版中,您需要安装policycoreutils软件包并添加SELinux对N

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号