[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.mzph.cn/news/742079.shtml

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

相关文章

Git的两大学习目标和具体使用情景

学习的两大目标 1. 技术目标,学习一些基础的技术问题 操作原理与常见区域 掌握Git企业级应⽤,深刻理解Git操作过程与操作原理,理解⼯作区,暂存区,版本库的含义 深刻学习Git的所有操作,过程和原理&#xf…

【系统架构设计师】系统工程与信息系统基础 01

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 文章目录 系列文章目录 前言 一、系统工程 ★ 二、信息系统生命周期 ★ 信息系统建设原则 三、信息系统开发方法 ★★ 四、信息系统的分类 ★★★ 1.业务处理系统【TPS】 2.管理信息系统【MIS】 3.决策支持系统…

VMware安装Ubuntu虚拟机

1. 安装VMware VMware中国官网:VMware - Delivering a Digital Foundation For Businesses VMware Workstation Player(官方个人免费版):VMware Workstation Player | VMware VMware Workstation Pro(商用收费版&am…

Glusterfs 常用命令

1. 启动/关闭/查看glusterd服务 #启动: systemctl daemon-reload systemctl start glusterd#开机自动启动glusterd服务: systemctl enable glusterd#关闭: systemctl stop glusterd#查看状态: systemctl status glusterd 2. 为存…

并发编程1-多线程并发编程的基本概念

多线程并发编程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务,从而提高程序的效率和响应性。以下是多线程并发编程的基本概念: 线程:线程是程序中的执行单元,它可以独立运行,并拥有自…

java的23种设计模式01-设计模式介绍

一、设计模式的定义 设计模式,是指在软件设计中,被反复使用的一种代码设计经验。 目的:是为了可重用代码,提高代码的可扩展性和可维护性。 软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码…

GZ083 产品艺术设计赛题第四套

全国职业院校技能大赛 产品艺术设计赛项赛题四 赛项名称 产品艺术设计 英语名称 Product Art Design 赛项编号 GZ083 归属产业 数字产业 任务名称 “探索”主题儿童行李箱设计 赛项组别 中职组 高职组 □学生组 □教师组 □师生联队试点赛项 R学生组 □教师组 □…

Python相关的考试和认证

1.计算机等级考试二级python http://ncre.neea.edu.cn/ 2.蓝桥杯大赛青少年创意编程Python组 http://kid.lanqiao.cn/ 3.青少年编程能力等级_python(CERACU PAAT) http://paat.creacu.org.cn/ 4.全国青少年软件编程等级考试标准(Python1-6级) 中国电子…

CTP-API开发系列之九:行情登录及订阅代码

CTP-API开发系列之九:行情登录及订阅代码 前情回顾全局配置参数行情初始化代码行情登录行情订阅行情接收注意事项 前情回顾 CTP-API开发系列之一:各版本更新说明(持续更新) CTP-API开发系列之二:问题汇总(…

tigramite教程(六)使用TIGRAMITE 进行因果发现

使用TIGRAMITE 进行因果发现 基本用法简单玩玩万年不变的第一步:画出来调查数据依赖性和滞后函数PCMCI 因果发现错误发现率控制进一步相关的方法学教程 画图整合专家对链条的假设基准测试和验证因果效应估计数据集挑战滑动窗口分析 TIGRAMITE 是一个时间序列数据分析的python包…

【Python】新手进阶学习:os.sep---跨平台路径分隔符

【Python】新手进阶学习:os.sep—跨平台路径分隔符 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程👈 希望得到您…

挑战杯 多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习多目标跟踪 …

【Android】WebView请求HttpRequest和HttpResponse

通过重写WebViewClient默认方法,我们可以实现拦截网络请求的功能 拦截HttpRequest override fun shouldOverrideUrlLoading(view: WebView,request: WebResourceRequest ): Boolean返回true表示阻止该网页加载,返回false表示不拦截 HttpResponse ove…

MPP数据架构设计的缺点

目录 一、MPP架构 二、批处理架构和MPP架构 三、MPP架构的OLAP引擎 一、MPP架构 随着分布式、并行化技术成熟应用,MPP引擎逐渐表现出强大的高吞吐、低延时计算能力,有很多采用MPP架构的引擎都能达到“亿级秒开”。例如Impala、ClickHouse、Druid、Dor…

基于SpringBoot+MYSQL的旅游网站

目录 1、前言介绍 2、主要技术 3、系统流程分析 1、登录流程图如下: 2、管理员后台管理流程图如下: 3. 修改密码流程图如下: 4、系统设计 4.1、系统结构设计 4.2 数据库概述 4.2.1 数据库概念设计 4.2.2 数据库逻辑设计 5、运行截…

多线程多进程处理服务器并发(多进程处理如何解决僵死进程)

目录 1.可循环发送数据的代码 2.改成循环之后每次发现只能处理一个客户端 3.服务器端处理并发问题 3.1 思路 3.2 利用多线程实现并发 ​编辑 3.3 利用多进程实现并发 3.3.1 多进程并发产生的僵死进程问题 ​3.3.2 解决僵死进程问题 1.可循环发送数据的代码 服务器代…

计算机模式识别的基本步骤与详解

在数字化时代的浪潮中,计算机模式识别技术以其卓越的能力,在图像识别、语音识别、自然语言处理等领域展现出了广泛的应用前景。那么,计算机究竟是如何进行模式识别的呢?本文将详细解析计算机进行模式识别的基本步骤,并深入探讨每个步骤的核心要点。 一、模式识别的基本步…

unity中实现场景跳转

1,第一步创建2个场景(右键资源窗口,名字这里我取的1111和2222) 2.添加跳转按钮(双击其中一个场景并添加按钮) 3.编辑按钮的文字(将原本的按钮打开点击里面的text,就可以在右边编辑文…

【JSON】JSON解析 fastJson框架

一、JSON (一)、简介 JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。 ​ 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 ​ 易于人阅读和编写,同时也易于机器解析和生成,并有效地提…

MySQL8.0安装教程+使用Navicat远程连接

MySQL8.0安装教程使用Navicat远程连接 版本:MySQL8.0.28 环境:Windows11 1.MySQL下载 进入官网https://www.mysql.com/进行下载: 2.安装MySQL 下载好后,点击运行程序开始安装,安装步骤如下: 以下步骤验…