[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.mfbz.cn/a/453744.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

读西游记第一回:西游记世界格局

天地之数: 元:十二万九千六百岁(129600年) 1元12会:子、丑、寅、卯、巳、午、未、申、酉、戌、亥。每会18000年。与12地支对应。 亥会期:前5400年混沌期,后5400年,盘古开天辟地&am…

【STL】stack栈容器与list链表容器

1.栈stack 栈具有先进后出的特性,最先进入的数据压在最底下,最后出来 2.list链表容器 list链表容器是一种双向链表,两端都可插入与删除,是双向访问迭代器,与vertor随机访问迭代器有不同的区别 reverse(&…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Toggle)

组件提供勾选框样式、状态按钮样式及开关样式。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 仅当ToggleType为Button时可包含子组件。 接口 Toggle(options: { type: ToggleType, is…

2024-Android大厂(字节跳动,腾讯

PS:全文点击蓝色文字,即可跳转链接 【字节面试官:看了3000多份简历,面试1000场后,想给金九银十找工作的程序员几点建议附大厂真题面经】 本文主要介绍校招,上半年疫情原因真正面试的时间和机会也不多&#…

网络流量监控软件AnaTraf:优化性能、排除故障的最佳选择

目录 导言 网络流量监控的重要性 AnaTraf网络万用表的功能与优势 网络故障排除与优化网络性能 结论 导言 在当今数字化时代,计算机网络已经成为企业和组织的核心基础设施。然而,网络流量的管理和监控对于确保网络性能的稳定和优化至关重要。本文将介…

11双体系Java学习之方法

方法简述 package method;public class Demo01 {//main 方法public static void main(String[] args) {//实际参数:实际调用传递给他的参数int sum add (1,2);System.out.println(sum);//test();}//加法//形式参数,用来定义作用的public static int add…

工作中常用的git命令

git 分布式版本控制系统。 使用远程仓库时候会有多个协议可以选择,使用https不仅仅速度慢,而且每次push都要输入口令。 HEAD 当前版本的指针,当切换本地版本的时候会快速指向指定版本文件 master git为我们创建主分支 origin 远程仓库的名…

以102flowers数据集为例训练ResNet50模型

以102flowers数据集为例训练ResNet50模型 使用飞桨高阶API,使用最少的代码量,实现在102flowers数据集训练ResNet50模型。同时可以一条命令修改成Mnist、Cifar10、Cifar100等数据集,换成其它模型也是只需要一句话代码。 数据集介绍 102flowe…

合并 K 个升序链表

题目&#xff1a; class Solution { public://合并两个升序链表ListNode* mergetwo(ListNode* l1, ListNode* l2){if(!l1 || !l2) return l1 ? l1 : l2;ListNode* dummy new ListNode(0);ListNode* cur dummy;while(l1&&l2){if(l1->val < l2->val){cur-&…

【SQL Server安装绊脚石】排除报错的终极指南

&#x1f6a9;本文介绍 ​ 在迈向数据库管理系统的世界时&#xff0c;SQL server的安装过程往往是我们踌躇的绊脚石。一不小心&#xff0c;就可能陷入各种报错的困境中。然而&#xff0c;正是这些挑战&#xff0c;让我们更加升入地了解SQL server地安装与配置&#xff0c;也让…

Redis缓存问题详解和处理

缓存更新策略 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库. 常见的解决方案: 缓存空对象 优点: 实现简单, 维护方便缺点: 额外的内存消耗, 可能造成短期的不一致 布隆过滤 优点: 内存占用较少(保存的是数据…

15.2 Scrapy 入门

目录 一. 目标 二. 准备工作 三. 开始入门 1. 创建项目 2. 创建 Spider 3. 创建 Item 4. 解析 Response 5. 使用 Item 6. 后续 Request 7. 运行 8. 保存文件 9. 使用 Item Pipeline 一. 目标 以一个目标例子来实战理解。目标如下&#xff1a;&#xff08;1&…

智能计算的基本原理——智能计算原理与实践【文末送书-36】

文章目录 智能计算的基本原理基本原理技术智能计算在实践中的应用 智能计算&#xff1a;原理与实践【文末送书-36】 随着科技的不断发展&#xff0c;智能计算成为引领时代的前沿技术之一。从传统的计算机模型到如今的人工智能系统&#xff0c;智能计算不仅深刻地改变着我们的生…

Python 查找PDF中的指定文本并高亮显示

在处理大量PDF文档时&#xff0c;有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。 查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方…

海豚调度系列之:任务类型——SPARK节点

海豚调度系列之&#xff1a;任务类型——SPARK节点 一、SPARK节点二、创建任务三、任务参数四、任务样例1.spark submit2.spark sql 五、注意事项&#xff1a; 一、SPARK节点 Spark 任务类型用于执行 Spark 应用。对于 Spark 节点&#xff0c;worker 支持两个不同类型的 spark…

前端vue-Taro框架中使用插件 ---pinyin 将城市树形分类

1.需求 当我做一个获取城市的功能的时候 我发向后端返回的数据 和我想i选要的相差太多 这样的在手机端可以滑动 并且 快捷选中的城市列表 目前的数据是这样的&#xff0c;就是一个城市数组 目前这样的数组 我要想显示我的页面实现功能是不行的 需要是树形结够 所以我前端…

真空泵系统数据采集远程监控解决方案

行业背景 半导体制造业可以说是现代电子工业的核心产业&#xff0c;广泛应用于计算机、通信、汽车、医疗等领域。而在半导体生产加工过程中&#xff0c;如刻蚀、 镀膜、 扩散、沉积、退火等环节&#xff0c;真空泵都是必不可少的关键设备&#xff0c;它可以构建稳定受控的真空…

指针【理论知识速成】(3)

一.指针的使用和传值调用&#xff1a; 在了解指针的传址调用前&#xff0c;先来额外了解一下 “传值调用” 1.传值调用&#xff1a; 对于来看这个帖子的你相信代码展示胜过千言万语 #include <stdio.h> #include<assert.h> int convert(int a, int b) {int c 0…

优维大模型解密:从提示词工程到场景应用 ,剑指AIOps的牛刀小试

莫名其妙的“涌现”袭来&#xff0c;就像是海上来路不明的诡异海啸&#xff0c;当很多人都在吹捧大模型时&#xff0c;优维则选择理性潜入深水区&#xff0c;掌握了大模型的来龙去脉&#xff0c;也在实际应用中获得产品经验方法论。 这篇文章旨在全面剖析优维科技在大模型应用…

算法思想总结:双指针算法

一、移动零 . - 力扣&#xff08;LeetCode&#xff09; 移动零 该题重要信息&#xff1a;1、保持非0元素的相对位置。2、原地对数组进行操作 思路&#xff1a;双指针算法 class Solution { public:void moveZeroes(vector<int>& nums){int nnums.size();for(int cur…
最新文章