百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

面试官,为啥HashMap的长度是2的n次方?

yuyutoo 2024-10-23 16:41 7 浏览 0 评论


前言

HashMap的主干是一个数组,假设我们有3个键值对dnf:1,cf:2,lol:3,每次放的时候会根据hash函数来确定这个键值对应该放在数组的哪个位置,即index = hash(key)

1 = hash(dnf),我们将键值对放在数组下标为1的位置


3 = hash(cf)


1 = hash(lol),这时发现数组下标为1的位置已经有值了,我们就可以用链表的形式将这个键值对放到dnf键值对的下面

1.7 HashMap采用的是头插法,所以lol:3在数组为1的位置,dnf:1以链表的形式跟在lol:3的下面

在获取key为lol的键值对时,1=hash(lol),得到这个键值对在数组下标为1的位置,lol和dnf不相等,和下一个元素比较,相等返回

源码

基于jdk1.7.0_80,1.8和1.7相比 差不多,1.8只是多了一个新特性,当链表的长度>=8的时候,链表转换为红黑树提高查询的效率,1.7解读起来更容易


各种默认参数不再细说,这里说一下threshold和loadFactor,

threshold = capacity * load factor,即扩容的阀值=容量*负载因子,

比如HashMap的容量为16,负载因子为0.75,则阀值为16*0.75=12,

当HashMap中放入12个元素时(size=12),就会进行扩容

1.负载因子越小,容易扩容,浪费空间,但查找效率高

2.负载因子越大,不易扩容,对空间的利用更加充分,查找效率低(链表拉长)

上述中的键值对是存放在一个静态的内部类中,即数组中存放的元素



构造函数只做2件事,初始化数组大小和负载因子,要么自己指定,有么用默认值,可能有人会说threshold是扩容阀值不是数组的长度啊,我们一会细说,(代码省去一部分校验内容)


put操作



这里面试一般会问到为什么HashMap不能存放2个key相等的元素,因为放置key相等的元素时,新值会替换旧值,并且返回旧值

这里我们分析inflateTable,putForNullKey,addEntry方法,hash方法不进行分析,indexFor方法最后进行分析

传入的参数是构造函数初始化的threshold,将数组的长度变为>=size,并且是2的倍数的长度,这样即使初始化数组长度不是2的倍数,也会在第一次放值时变为2的倍数,并且对threshold重新设值


若key为null,则将值放在table[0]这个链上,这样key为null的时候直接从table[0]处取值即可



这里需要注意一下扩容的时机和扩容的大小,以后会和Hashtable,ConcurrentHashMap进行比较



将新增加的元素放到链表的第一位,并且将其他元素跟在第一个元素后面,即头插法


get方法



从table[0]初获取key为null的值


key不为null时



HashMap的大小为什么是2的倍数

h是hashcode,length时数组长度,下面这个方法是根据hashcode求出对象在数组中放置的位置


h & (length - 1) 等价于 h % length,我们假设数组的长度为15和16,hashcide为8和9

可以看出数组长度为15的时候,hash码为8和9的元素被放到数组中的同一个位置形成链表,键低了查询效率,当hahs码和15-1(1110)进行&时,最后一位永远是0,这样0001,0011,0101,1001,1011,0111,1101这些位置永远不会被放置元素,这样会导致1.空间浪费大,2.增加了碰撞的几率,减慢查询的效率。当数组长度为2的n次方时,2的n次方?1的所有位都是1,如8-1=7即111,那么进行低位&运算时,值总与原来的hash值相同,降低了碰撞的概率

相关推荐

YAML配置文件简介及使用(yaml 配置)

简介YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的缩写。相比JSON格式的方便。...

教你如何解决最常见的58种网络故障排除方法

1.故障现象:网络适配器(网卡)设置与计算机资源有冲突。分析、排除:通过调整网卡资源中的IRQ和I/O值来避开与计算机其它资源的冲突。有些情况还需要通过设置主板的跳线来调整与其它资源的冲突。2.故障现...

一分钟带你了解服务器网卡(服务器网卡怎么用)

今天小编和大家聊一下服务器的网卡。什么是网卡?简单说网卡就是计算机与局域网互连的设备。计算机主要通过网卡接入网络。网卡又称为网络适配器或网络接口卡NIC(NetworkinterfaceCard)...

linux文件之ssh配置文件的含义与作用

ssh远程登录命令是操作系统(包括linux和window系统)下常用的操作命令,可以帮助用户,远程登录服务器系统,查看,操作系统相关信息。linux系统对于ssh命令有专门保存其相关配置的目录和文件...

Cilium 官方文档翻译 - IPAM(二)Kubernetes Host模式

KubernetesHostScopeciliumIPAM的kuberneteshost-scope模式通过选项ipam:kubernetes开启,将集群IP地址分配委托给每个独立的节点,并...

域名劫持跳转,域名劫持跳转的解决办法只需5步

简单来说,域名劫持就是把原本准备访问某网站的用户,在不知不觉中,劫持到仿冒的网站上,例如用户准备访问某家知名品牌的网上商店,黑客就可以通过域名劫持的手段,把其带到假的网上商店,同时收集用户的ID信息和...

Linux基本命令(linux基本命令总结)

...

Linux 磁盘和文件系统管理(linux磁盘管理fdisk)

1检测并确认新硬盘...

windows host文件怎么恢复?局域网访问全靠这些!

windowshost文件怎么恢复?windowshost文件是常用网址域名及其相应IP地址建立一个关联文件,通过这个host文件配置域名和IP的映射关系,以提高域名解析的速度,方便局域网用户使用...

Nginx配置文件详解与优化建议(nginx 配置详解)

1、概述今天来详解一下Nginx的配置文件,以及给出一些配置建议,希望能对大家有所帮助。...

Mac电脑hosts文件锁定,如何修改hosts文件权限

有时候我们需要修改hosts文件,但是网上很多教程都行不通,使用sudo命令也不行。其实有一个很简单的方法。打开终端命令行,使用如下命令即可:sudochflags-hvnoschg/etc/...

windows电脑如何修改hosts文件?(windows 修改hosts文件)

先来简单说下电脑host的作用hosts文件的作用:hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中...

Vigilante恶意软件行为怪异:修改Hosts文件以阻止受害者访问盗版网站

Sophos刚刚报道了一款名叫Vigilante的恶意软件,但其行为却让许多受害者感到不解。与其它专注于偷密码、搞破坏、或勒索赎金的恶意软件不同,Vigilante会通过修改Hosts文件...

hosts文件无法修改几种现象和解决方法

第一种、hosts文件修改完不是直接保存而是弹出另存为窗口解决:1、右击hosts文件——属性——把“只读”前面勾去掉。第二种、打开hosts文件时提示“你没有权限打开该文件,请向文件的所有者或管理员...

hosts文件位置在哪里,教你hosts文件位置在哪里

Hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的I...

取消回复欢迎 发表评论: