Java底层原理——HashMap面试问题

2023-11-02

什么时候会用到HashMap?他有什么特点

是基于Map接口实现的,存储键值对时,可以接收null的键值,是非同步的,HashMap存储着Entry(hash,key,value,next)对象。

你知道HashMap的工作原理吗

通过hash方法,通过put和get存储和获取对象。存储对象是,我们把键值对传递给put方法时,它调用key的hashCode方法计算hash从而得到bucket位置,进一步存储,如果发生碰撞,HashMap会通过链表将产生碰撞的元素组织起来。HashMap会根据当前bucket的占用情况自动调整容量(超过loadFactor会resize为原来的2倍)。获取对象时,将Key穿给get方法,他调用key的hashCode方法计算hash获得bucket位置,并进一步调用equals方法确定键值对。在JDK8中,如果一个bucket中冲撞的元素数量超过8时,会使用红黑树替换链表,从而提升速度

你知道get和put的原理吗?equals()和hashCode()都有什么作用?

通过key的hashCode方法进行hash,并通过(n-1&hash)的方法计算下标,从而获取buckets(桶下标)的位置,如果发生碰撞则采用key.equals()方法去链表或红黑树中查找对应的节点

你知道hash的实现吗?为什么要这样实现

在java8的实现中,是通过hashCode()的高16位异或低16位也就是扰动函数实现的。(h = key.hashCOde()) ^ (h>>>16),主要是从速度、功效、质量来考虑的,这么做可以在bucket的n比较小的时候,也能保证考虑到高低bit都参与到hash的计算中,同时不会有太大的开销

如果HashMap的大小超过了负载因子(loadFactor)定义的容量怎么办?

如果超过了负载因子,则会resize一个长度两倍的HashMap,并且在Java7中进行链表元素迁移的时候会进行rehash。而在java8中进行了一些优化,不需要进行rehash,什么优化呢?由于HashMap的长度为2的次幂所以扩容的时候需要迁移的链表元素有两种情况,要么桶下标不变,要么变为桶下标大小加上原来的HashMap的长度大小,决定一个链表元素是那种情况只在于新加入的1bit是0还是1。

当两个对象的hashCode相同会发生什么

因为hashCode相同(不代表对象地址相同),所以他们的bucket位置相同,‘碰撞’会发生。在put操作执行时发生碰撞,这个Entry会储存在链表中,如果两个对象的hashCode一样,将会通过equals()比较值决定是否采取覆盖行为(返回true),还是插入到链表中(返回false)

如果两个键的hashCode相同,你如何获取值对象

找到bucket位置后,会调用keys.equals()方法去链表找到正确的节点,最终找到要找的值对象。因此,设计HashMap的key类型时,如果使用不可变的、声明为final的对象,并且采用合适的equals()和hashCode()方法的话,将会减少碰撞的发生,提高效率。不可变能够缓存不同键的hashCode,这将提高整个获取对象的速度。、

如果HashMap的大小超过了负载因子(loadFactor)定义的容量怎么办?

默认的负载因子大小为0.75,也就是说,当一个map填满了3/4的bucket的时候,就会进行resize操作,重新创建一个大小为原来两倍的bucket数组,并将原来的对象放入新的bucket数组中,在java7时链表元素转移时会进行rehash而在java8中做了一些优化性能的操作不需要进行rehash

你了解重新调整HashMap大小存在什么问题吗?

当resize的时候确实存在条件竞争,因为如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来(java7会出现这种情况,java8做了优化不会使用头插法),因为移动到新的bucket位置的时候,HashMap并不会将元素放在链表的尾部,而是放在头部(同样是java7出现的情况),这是为了避免尾部遍历。如果条件竞争发生了,那么就死循环了。因此在并发环境下,我们使用CurrentHashMap来替代HashMap

为什么String,Integer这样的wrapper类适合作为建?

因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入和获取的时候返回不同的hashCode的话,那么就不能从HashMap中找到想要的对象。不可变性还有其他的优点如线程安全。见对象重写这两个方法是非常重要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java底层原理——HashMap面试问题 的相关文章

  • 需要在没有wsdl的情况下调用soap ws

    我是网络服务的新手 这个网络服务是由 siebel 提供的 我需要调用一项网络服务 我的客户向我提供了以下详细信息 这是 SOAP 对于产品 请使用它作为端点 Request
  • removeall 和removeif 的用例

    我找到了这个 fun main val list MutableList
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 如何在Redis中使用HSCAN命令?

    我想在我的作业中使用 Redis 的 HSCAN 命令 但我不知道它是如何工作的 Redis 的官方页面 http redis io commands hscan http redis io commands hscan 这个命令给了我空白
  • 放置 时覆盖引导程序的托管版本 3.2.0

    当我把
  • POJO 到 Google App Engine 中的 XML 字符串?

    我想为我的 Java Google App Engine 程序创建一个 REST 接口 我想我应该从我的 POJOS 生成一些 XML 开始 然而 XStream似乎受到了GAE的限制 我可以使用什么在 Google App Engine
  • 在 Java 中并行处理两个任务

    我想在一个方法中调用8个方法 这8个方法中的2个方法是一个洞任务 其余6个方法是另一个洞任务 我想同时并行处理这两个任务 据我所知 我可以用线程来做到这一点 但说实话 要么我看不到与我的目标相似的示例 要么即使我看到了我也无法理解该示例 您
  • Android 2.3.4 SSL问题

    升级到 Android 2 3 4 后 出现以下异常 javax net ssl SSLException Read error ssl 0x I O error during system call Connection timed ou
  • Java 8 流中的 JUnit 断言

    假设我将三个对象保存到数据库中并将数据库生成的 ID 设置为其中 我不知道从方法返回的对象的顺序saveToDb 但我想测试这些生成的 ID 是否存在 我如何在流中做到这一点 我想做这样的事情 List
  • Gradle Output Jar 没有主类

    我有以下简单的 build gradle 文件 apply plugin application apply plugin java mainClassName com kurtis HelloGradle 以下单个 java 文件位于sr
  • 我如何解释这个 JVM 错误?

    我有一个使用一些本机代码的 Java 应用程序 但它出现了错误 我想知道where它有错误 但我不确定如何读取 hs err pid 转储文件 Native frames J compiled Java code j interpreted
  • Intellij - 调试器断点不再工作

    我正在正常工作 调试Java Maven项目与IntelliJ 2018 2 1 然后我单击 Intellij 停止应用程序以对代码进行一些修改 当我在调试模式下再次启动应用程序时 它 调试器 只是停止工作 现在 应用程序需要大约 10 2
  • 这种复杂的泛型模式会导致 Eclipse 崩溃 - 我可以让它工作吗?

    我使用的是 Eclipse Luna 4 4 0 JDK 1 8 0 05 我正在制作一个游戏 游戏世界的拓扑结构可以大致分为World gt Level gt Tile 其中图块是地形的一个小单位 我设置了三个项目 一个包含这些结构的一些
  • Java中字符串中特殊字符的替换

    Java中如何替换字符串 E g String a adf sdf 如何替换和避免特殊字符 您可以删除除此之外的所有字符可打印的 ASCII 范围 http en wikipedia org wiki ASCII ASCII printab
  • Java - 为什么不允许 Enum 作为注释成员?

    It says 原始 String Class an Enum 另一个注释 上述任何一个的数组 只有这些类型才是合法的 Annotation 成员 为什么泛型 Enum 不能成为 Annotation 的成员 例如 Retention Re
  • 在文本文件中写入多行(java)

    下面的代码是运行命令cmd并使用命令行的输出生成一个文本文件 下面的代码在 Eclipse 的输出窗口中显示了正确的信息 但在文本文件中只打印了最后一行 谁能帮我这个 import java io public class TextFile
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • wait() 在游戏中如何工作?

    在 playframework 的文档中here http www playframework org documentation 1 2 1 asynchronous已写 public static void loopWithoutBlo
  • 如何安全地解决这个 Java 上下文类加载器问题?

    我的数百名用户中只有一位在启动我的 Java 桌面应用程序时遇到问题 他只有大约三分之一的时间开始 另外三分之二的时间在启动时抛出 NullPointerException Exception in thread AWT EventQueu

随机推荐

  • RelativeLayout相对布局

    相对布局 RelativeLayout 允许子元素指定它们相对于其父元素或兄弟元素的位置 这是实际布局中最常用的布局方式之一 它灵活性大很多 当然属性也多 操RelativeLayout相对布局 相对布局 RelativeLayout 允许
  • 「软件测试」最全面试问题和回答,全文背熟不拿下offer算我输

    一般要应聘关于测试的工作 面试题会不会很难 下面小编整理了软件测试面试题及答案 欢迎参考 一 引言 1 1 文档目的 本次文档是为了收集在面试中遇到的一问题与常见的一些答案并不是唯一答案 二 职业规划 2 1 简单的自我介绍下 面试宫 您好
  • 对注意力机制(Attention)的一些理解附上Bi-LSTM和seq2seq加上注意力机制的代码

    注意力机制 简单来说就是让模型能够学会具体问题具体分析吧 比如问你是个水果大师 别人问你这个苹果怎么样 那总得盯着苹果端详吧 而不是去看那个西瓜 理解的应该差不太多吧 这个是从b站看的一个手推注意力机制的视频 照着画了一遍 感觉大概也是明白
  • Java可视化界面设计(登录界面设计)

    1 界面居中显示 frame setResizable false fame setLocationRelativeTo null frame setVisible true 2 全屏操作 Dimension screenSize Tool
  • 联想微型计算机C470拆装,联想C470一体机一键U盘重装系统教程图解

    联想C470一体机造型小巧 外观唯美时尚 易于摆放并能脱离冗杂线缆的束缚 该机是一款非常时尚的家用一体电脑 采用21 5英寸触控屏幕 全高清显示相当精细 无论是学习办公 还是家庭娱乐都能够满足用户的需求 下面给大家介绍联想C470一体机一键
  • 数的分解

    题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 把 20192019 分解成 33 个各不相同的正整数之和 并且要求每个正整数都不包含数字 22 和 44 一共有多少种不同的分解方法 注意交换 33 个整数
  • 七牛产品概览

    七牛云产品概览 服务对象 个人开发者 创业团队 企业用户 对象存储 Kodo 简介 七牛云提供的数据存储服务主要是针对静态资源文件 image js css 音频 视频 文档 PDF txt json xml yml apk 等等 提供存储
  • Java中string的null和“”对比

    Java中字符串的比对用string equals object 来做 但与空字符串比对的时候要注意 如果是 话 用string equals 如果是null的时候 string equals null 会报错 应该使用string nul
  • SYSAUX表空间清理之WRH$_ACTIVE_SESSION_HISTORY

    查看sysaux表空间使用率高 对于sysaux表空间之前有文章讨论过 本次直入正题 1 检查sysaux表空间占用空间较大的segments SQL gt select from select owner segment name seg
  • mysql while bug_案例分享:MySQL BUG处理

    近一个月处理历史数据问题时 居然连续遇到了2个MySQL BUG 分享给大家一下 也欢迎指正是否有问题 BUG1 数据库版本 MySQL5 7 25 28 操作系统 Centos 7 7 不重要 数据库架构 主 从 级联从 数据库参数 in
  • Java 冒泡排序示例

    以下是 Java 语言实现冒泡排序的示例代码 public class BubbleSort public static void main String args int arr 5 2 8 3 9 1 bubbleSort arr Sy
  • 64、3D Neural Scene Representations for Visuomotor Control

    简介 主页 https 3d representation learning github io nerf dy 机器人操作模型学习的核心问题之一是如何确定 dynamics model 的状态表示 理想的表示应该易于捕捉环境动态 展示对场
  • CDN是做什么用的,怎么一直有人在推荐使用?

    CDN 内容分发网络 的作用与不断的推荐使用背后有着深刻的原因 这是因为CDN在互联网领域发挥着重要且多方面的作用 为许多网站和在线业务提供了显著的优势 首先 让我们来了解CDN的作用是什么 CDN是一种网络架构 旨在将网站的静态资源 如图
  • 100级小号搬砖地图_DNF100版本搬砖地图最高收益攻略(利润化透明)

    DNF搬砖那个地图收益最高 100版本搬砖攻略 大家都知道DNF是一款经典的手游 到现在已经运营十年了 同时也是一款氪金的 当然对于神豪来说都是小问题 但是对于一般的玩家 想玩DNF建议还是先去医院检查一下肝 肝不好建议别入坑 今天小编就给
  • 数学的科普文

    20210105 这次又是整理自己的书签 然后发现了这个文章 这个文章应该是很久之前的时候我看到的 觉得很有趣 应该是当时学习最小二乘法的时候看到的 所以这篇文章就来记录一些平时看到的不错的科普文 以前很多文章都错过了 挺可惜的 正态分布的
  • React Hook的useCallback,memo,usememo的使用

    1 useCallback 每当组件重新渲染的时候 我们之前定义的函数就会被重新声明一次 即使这个函数不需要做出改变 这时可以使用useCallback useCallback主要用于缓存一个函数 useCallback接收两个参数 第一个
  • Apriori算法完整代码

    文章目录 apriori py apriori py usr bin env python coding utf 8 from numpy import 加载数据集 def loadDataSet return 1 3 4 2 3 5 1
  • 深度学习与计算机视觉系列(5)_反向传播与它的直观理解

    作者 寒小阳 龙心尘 时间 2015年12月 出处 http blog csdn net han xiaoyang article details 50321873 声明 版权所有 转载请联系作者并注明出处 1 引言 其实一开始要讲这部分内
  • javaScript:宏任务与微任务的运行顺序

    在写代码的时候 我使用Element组件中的表单重置方法 和vue中子传父方法 这里我想要通过 async 和 await 的特点 await 下一行代码作为微任务执行 来规定代码的执行顺序 让重置方法 滞后 于数据传递 执行 确定按钮 子
  • Java底层原理——HashMap面试问题

    什么时候会用到HashMap 他有什么特点 是基于Map接口实现的 存储键值对时 可以接收null的键值 是非同步的 HashMap存储着Entry hash key value next 对象 你知道HashMap的工作原理吗 通过has