[Java、Android面试]_02_HashMap的原理

本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料,感兴趣的朋友可收藏+关注。由于时间有限,只能每天整理一点,分享一点儿!
现分享如下:

1. HashMap原理

HashMap是非常频繁面试问的题目,一定要好好理解,最好是查看源码吃透它。

HashMap的底层实现是使用:数组+链表/红黑树
HashMap内部维护了一个存储数据的Entry数组,HashMap采用链表解决冲突,每一个Entry本质上是一个单向链表。当准备添加一个key-value对时,首先通过hash(key)方法计算hash值,然后通过indexFor(hash,length)求该key-value对的存储位置,计算方法是先用hash&0x7FFFFFFF后,再对length取模,这就保证每一个key-value对都能存入HashMap中,当计算出的位置相同时,由于存入位置是一个链表,则把这个key-value对插入链表头
在这里插入图片描述

在jdk1.8之后hashmap已经优化了hashmap的单链表,当数据存储到8位之后内部采用红黑树结构来存储数据,这样会比单链表更快。

2. 常考点

Q1:Table的初始化
通过阅读源码可发现,HashMap有四种构造方式:
· 根据指定的initialCapaccity和loadFactor实例化一个空对象;
· 通过指定的 initialCapacity 和 默认的 loadFactor(0.75) 实例化一个空的
HashMap 对象
· 通过默认的initialCapacty和模型的loadFactor(0.75)实例化一个空的HashMap
· 通过指定的Map对象实例化一个HashMap对象

通过源码可以知道:实例化的时候未进行table的初始化,而什么时候初始化呢?一般情况下,在第一次对table进行put时,调用resize方法时,进行table的初始化。(这是一种懒加载思想)。一般情况下,初始化table.length=16, 阈值threadhold=12,当存放到第13个元素时进行扩容。(threadhold=capacity*loadFactor)

Q2: table的扩容方式
还是在调用resize()时进行扩容,扩容的方式是:当size>threshold时进行扩容,扩容之后的 table.length = table.lenght2, threshold = threshold2

Q3: Table的length为什么是2的n次幂
是为了能利用位运算(&)来求 key 的下标,而 h&(length-1) 是为了充分利用 table 的空间,并减少 key 的碰撞;

Q4: Table的取模运算为什么是e.hash & (capacity-1)
因为一般的取模运算是e.hash % capacity,而e.hash &(capacity-1) = e.has%capacity

3. Hashmap和Hashtable的异同

(1)相同点
· 两者都是基于哈希表实现的,每一个元素是一个key-value对,内部通过单链表解决访问冲突,容量不足时会自动增长。
· 两者都实现了序列化Serializable接口,支持序列化,实现了Cloneable接口,可被克隆。

(2)不同点
· HashMap是非线程安全的,Hashtable是线程安全的;
· HashMap的key和value允许为null,而HashTable不允许。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535475.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第25天|216.组和总和三、17.电话号码的字母组合

目录 一、力扣216.组合总和三1.1 题目1.2 思路1.3 代码 二、力扣17.电话号码的字母组合2.1 题目2.2 思路2.3 代码 一、力扣216.组合总和三 1.1 题目 1.2 思路 自己的想法:和总和问题思路类似,回溯法。 (1)k个数的组合&#xff0…

【C语言】三种方式实现字符串(char*)/字符数组(char[ ])输入输出

前言 做题时经常需要用到字符串,写篇笔记加强记忆,本文用 4个例子实现字符串的输入输出操作。 scanf(); 从键盘输入数据时,遇到 “空格”、“回车” 都会终止。若要接受空格,使用 gets(); 代替 scanf(); 多个 scanf(); 同时出现…

yum安装mysql、数据库tab自动补全,快来浅了解下 ?

centos7上面没有mysql,它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

(自用笔记)每天一点vue3—— echarts横坐标刻度标签显示不完全的问题

我是想做一个vue3echarts的账单数据展示项目,因为有vue2的基础,打算直接在这个项目上熟悉掌握vue3的新特性。这系列笔记就按照遇见问题解决问题的思路更新,不按照官方快速上手的章节,特此说明。 echarts 上次遗留一个横坐标刻度标…

CSS学习2

自己在工作中总是有一些自动化开发的需求,总是以为自己是有前端基础的,但是一写页面,布局都布不好,真是搞笑,说起来还是基本功不扎实啊,这里在重新复习一下,然后记录一下文档。后边在写两个综合…

判断出栈顺序是否合法

给你一个入栈顺序,判断出栈顺序是否合法 入栈的顺序(1,2,3,4,5)出栈(4,5,3,2,1)是合法序列 入栈的顺序(1&…

给你的 SpringBoot 工程部署的 jar 包瘦瘦身吧!

一、背景 SpringBoot 为我们快速开发提供了很好的架子,使得我们只需要少量配置就能开始我们的开发工作,但是当我们需要打包上传部署时,却是很神伤的一个问题,因为打出来的 Jar 包少则十几兆,多则一百来兆,…

缓存的使用

文章目录 1.为什么要有缓存?2.缓存使用场景3.缓存分类4.缓存使用模式5.淘汰策略6.缓存的崩溃与修复7.缓存最佳实践参考文献 1.为什么要有缓存? 数据访问具有局部性,符合二八定律:80% 的数据访问集中在 20% 的数据上,这…

自主通用多物理场仿真PaaS平台伏图(Simdroid)及伏图电子散热模块上架华为云商店

随着云计算、大数据等前沿技术的蓬勃发展,国内制造业正面临智能制造转型升级的机遇与挑战。工业软件是制造业研发创新不可或缺的核心工具,《“十四五”智能制造发展规划》中明确了工业软件对于智能制造的核心支撑作用,着重提出加强关键核心技…

机器视觉检测设备的组成要素

机器视觉检测设备是一种先进的自动化检测技术工具,它利用光学、图像处理和计算机硬件及软件技术模拟并扩展人类的视觉功能,以实现对产品或目标物体进行自动化的尺寸测量、缺陷检测、表面质量评估、颜色识别、形状匹配以及位置判断等功能。这种设备通常包…

《ElementPlus 与 ElementUI 差异集合》el-button 属性 type=“text“ 被删除

差异 element-ui el-button中&#xff0c;属性 type"text" 定义文字按钮&#xff0c;也是链接按钮&#xff1b;element-plus el-button中&#xff0c;改为新增属性 link 并与其它 type 值配合使用&#xff1b; // element-ui <el-button type"text"&g…

图【数据结构】

文章目录 图的基本概念邻接矩阵邻接表图的遍历BFSDFS 图的基本概念 图是由顶点集合及顶点间的关系组成的一种数据结构 顶点和边&#xff1a;图中结点称为顶点 权值:边附带的数据信息 路径 &#xff1a; 简单路径 和 回路&#xff1a; 子图&#xff1a;设图G {V, E}和图G1…