HashMap扩容机制

时间:2024-01-10 01:07:19 标签:  散列表  数据结构  java  

HashMap的扩容机制

HashMap在容量超过负载因子所定义的容量后,就会扩容,将HashMap的大小扩大为原来的两倍。

  1. 判断当前数组是否为空,为空则是初始化操作

  2. 如果旧数组长度大于等于最大容量MAXIMUM_CAPACITY=1 <<30,则将临界值threshold置为Integer.MAX_VALUE整型最大值并返回旧数组。

  3. 否则判断将oldCap扩大两倍后仍小于最大容量并且oldCap>=16(默认初始容量),则将新临界值newThr置为旧临界值的两倍。

  4. 之后判断oldThr是否大于0,若大于,则将newCap新容量置为oldThr旧临界值,否则,将newCap置为默认值16,newThr置为默认值12

  5. 之后将threshold置为newThr,并创建新容量的table数组

  6. 将旧数组中的元素利用新的数组长度重新计算索引并插入到新数组中,若该元素没有next,则说明是单个结点,直接放在数组中;若旧结点为红黑树结点,则进行树节点的插入方式。

  7. 若发现插入的结点是链表,则进行维护,低位链表,则存放扩容之后的数组下标位置与当前数组下标一致;高位链表,则存放扩容之后的数组下标位置为原索引+扩容之前容量。

    do {
                                next = e.next;
                                //oldCap为16:10000,与e.hash&运算,可以得出高位是0还是1
                                //高位为0,放在低位链表
                                if ((e.hash & oldCap) == 0) {
                                    if (loTail == null)
                                        loHead = e;
                                    else
                                        loTail.next = e;
                                    loTail = e;
                                }
                                //高位为1,放在高位链表
                                else {
                                    if (hiTail == null)
                                        hiHead = e;
                                    else
                                        hiTail.next = e;
                                    hiTail = e;
                                }
                            } while ((e = next) != null);

总结:扩容之后的元素结点位置有两种调整,要么保持索引不变,要么为原索引+原容量的位置。这样计算,节省了时间。

来源:https://blоg.сsdn.nеt/qq_52305846/аrtiсlе/dеtаils/123397932

智能推荐

介绍一下几个名词:容量:capacity ,默认16。加载因子:loadFactor,默认是0.75阈值:threshold,默认12。threshold=capacitytloadFactor;当元素个数超过阈值时,就会触发扩容。什么时候需要扩容:HashMap数组中元素个数超过阈值,即触发扩容。例如:默认情况下,容量16,加载因子0.75,阈值12,当HashMap中的元素个数超

标签:机制  HashMap机制  HashMap  

HashMap的扩容机制 HashMap在容量超过负载因子所定义的容量后&#xf

标签:散列表  数据结构  java  

起因在Leetcode上做题写了两种暴力解法,但是执行效率上不太一样。时间上差很远,内存虽然差不多但是前者击败30%,后者击败94%。这两种解法区别是用一条ArrayList还是两条来存数据,所以contains虽然执行次数一样但是检测的长度上不一样,而且ArrayList的扩容次数也不一样,所以学习一下。

标签:函数  机制  java  ArrayList  

1、虚拟化平台虚拟机添加硬盘系统查看添加的硬盘[root@yumserver&nbsp;~]#&nbsp;lsblkNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs

标签:磁盘  虚拟机  lvm  parted  

一、先在虚拟机设置里面调整虚拟硬盘大小

标签:Linux&amp;amp;树莓派&amp;amp;kali  linux  bash  ubuntu  

在VM虚拟机中&#xff0c;我们经常会选择默认磁盘大小20G&#xff0c

标签:linux  linux  运维  服务器  网络  bash  

新手村的选手在刚开始安装使用 CentOS 虚拟机时&

标签:centos  linux  运维  

1、表空间容量指标查询SELECT TABLESPACE_NAME 表空间, To_char(Round(BYTES / 1024,

标签:空间  oracle  

情况说明:在VMware vsphere的虚拟化平台下,为了快速部署虚拟服务器,我们常常使用模板部署虚拟机。但真实业务有时要求的文件系统分区和大小常常与模板不同,这时便需要自定义硬件资源和使用 LVM 方式扩容。在定义硬盘的时候我们可以在原有的硬盘上直接增加,然后虚拟机创建完成后再进入系统进行扩容,这时就需要用到fdisk命令将新增的硬盘容量建立为 LVM 分区,然后扩容到现有的 LV 组里,这次我们来扩容 swap 分区。&nbsp;1、查看磁盘信息,我们可以看到sda是500G,但sda1和sda2两个分区加起来才使用了100G;这是因为建立模板机时的分区导致的,接下来我们就对新增的400G容量使用fdisk分区。

标签:分区  swap  

SRAM即静态随机存取存储器,所谓“静态”是指这种存储器只要保持通电,里面存储的数据就可以一直保持,但是掉电之后就会丢失。与DRAM(动态随机存取存储器)相比它不需要周期性的刷新里面的数据,操作简单且速度更快,但是更加的昂贵,集成度不如DRAM高。&nbsp;在实际应用中的存储器所需要的容量通常比所生产的芯片容量大得多,所以需要对多芯片进行组合以实现存储容量的扩充。本文以SRAM芯片为例系统介绍常用的扩充存储容量的方法。通常微处理器的数据总线为8位和16位或32位,而地址总线为16位或24位不等。当静态RAM的地址线和数据线不能与微机相匹配时,可用地址线扩展和数据线扩展或地址和数据线同时进行扩展的方法加以解决。&

标签:容量  SRAM  

 一、磁盘扩容方式 CentOS 系统的磁盘扩容可以分为两种方式&#xff1a;

标签:Linux运维学习实践  centos  linux  运维  

大体情况&#xff1a; 在VM虚拟机上安装了移动云的BCLinux镜像&#xff0

标签:Linux学习  centos  linux  运维  

0&#xff0c;关闭虚拟机&#xff0c;打开虚拟机设置&#xff0c;跳转到

标签:centos  linux  运维  

核心成员变量JDK7Entry[] table。Entry存储了HashMap的真正数据size大小,代表HashMap内存储了多少个键值对capacity容量。实际上HashMap中没有一个成员叫capacity,它是作为table这个数组的大小而隐式存在threshold阈值和loadFactor(默认0.75f)装载因子。threshold是通过capacity*loadFactor得到的。当size超过threshold时(刚好相等时不会扩容),HashMap扩容会再次计算每个元素的hash位置entrySet、keySet和values这三个都是

标签:HashMapHashMap  

JDK1.7哈希碰撞是采用(头插)法来改变节点的排列   可能出现收尾想连的问题(也叫环形链表)  

标签:笔记  java  散列表  开发语言  

1.逻辑卷管理LVM &#xff08; Logical Volume Manager&#xff09;

标签:运维  

猜你喜欢

k8s的node进行扩容&#xff0c;扩容的机器需要满足以下前提条件

标签:kubernetes  容器  云原生  

作者:京东科技&nbsp;徐宪章1 什么是超容量扩容超容量扩容功能,是指预先调度一定数量的工作节点,当业务高峰期或者集群整体负载较高时,可以使应用不必等待集群工作节点扩容,从而迅速完成应用横向扩容。通常情况下HPA、ClusterAutosacler和超容量扩容同时使用以满足负载敏感度高的业务场景。超容量扩容功能是通过K8S应用优先级设置和ClusterAutosaler共同作用实现的,通过调整低优先级空载应用的数量,使集群已调度资源保持在较高的状态,当其他高优先级应用因为HPA或者手动调整应用分片数量

标签:集群  容量  kubernetes  

上一篇文章讲解了Redis集群原理及搭建,由于工作中使用docker较多,本文主要讲解使用docker搭建集群及对集群的扩展收容。环境:Centos7.6Docker:20.10.12Redis:6.2.61 集群配置集群配置步骤1、创建redis-cluster.tmpl配置Redis信息【端口、是否开启集群等】2、创建redis.sh配置需要创建的redis信息3、添加网络,redis集群使用该网络4、执行redis.sh实现创建redis5、执行red

标签:集群  docker  redis  cluster  

一个简单的HashMap的使用例子:package hashmap;import java.util.HashMap;/** * @Author: Neco * @Description: 一个简单的HashMap的使用 * @Date: create in 2022/6/20 22:51 */public class Test { public static void main(String[] args) { HashMap<String, Object> map = new HashMap<>(); map.put(necde, Ne

标签:容器  简单  java  HashMap  Map容器  简单  java  HashMap  map  

一、LVM介绍 1、LVM是Linux中对硬盘分区的一种管理机制。

标签:linux  

ZFS文件系统简介 Solaris10默认的文件系

标签:操作系统  存储  Unix  solaris  zfs  

在阿里云控制台&#xff0c;操作完成在线扩容以后&#xff0c;发现新的磁盘空间已经有了&#xff

标签:java Web 环境  5G  运维  

集群之哈希槽搭建请阅&#xff1a;RedisCluster集群实现原理之哈希槽&#xff08;ha

标签:redis  哈希算法  散列表  算法  

前言知识点定级:入门级使用 Heketi Topology 扩容磁盘使用 Heketi CLI 扩容磁盘实战服务器配置 (架构 1:1 复刻小规模生产环境,配置略有不同)主机名IP

标签:磁盘  实战  kubernetes  GlusterFS  

HashMap源码目录1.1 包含的属性

标签:源码  HashMap  

磁盘扩容 在虚拟机环境中&#xff0c;随着业务的增长和数据的积累&#xff0c

标签:开发语言  centos  运维  

原文链接: Go 语言切片是如何扩容的?在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一种引用类型,它有三个属性:指针,长度和容量。底层源码定义如下:

标签:切片  语言  

fdisk 命令 创建分区 实现扩容Linux fdisk命令简介Linux fdisk 是一个创建和维护分区表的程序,它兼容 DOS 类型的分区表、BSD 或者 SUN 类型的磁盘列表。# fdisk --helpfdisk:无效选项 -- -用法: fdisk [选项] <磁盘> 更改分区表 fdisk [选项] -l <磁盘> 列出分区表 fdisk -s <分

标签:分区  命令  fdisk  

摘要:卷扩容一般指实例级的磁盘扩容。本文分享自华为云社区《【公有云公共】卷扩容业务失败》,作者:酷哥。一、基本背景介绍卷扩容一般指实例级的磁盘扩容。随着客户业务的不断开展,磁盘使用率也会随之增加。当磁盘使用率过高时,会影响数据库的使用,这时建议用户清理无用数据、运维清理无用日志或用户来操作卷扩容任务。tips:

标签:在线  业务  失败了  

背景介绍 之前写过比较多的关于lvm的文章&#xff1a; Ce

标签:linux系统运维  centos  linux  运维  

相关问题

相关文章

热门文章

推荐文章

相关标签