HashMap面试相关问题

2023-10-27

1.HashMap的底层实现原理?

HashMap的底层是数组+链表的方式,通过Hash算法决定每个元素的存储位置,当程序执行map.put()方法时,系统会调用hashcode()方法来得到他的hash值,通过hash值来确定该元素的存储位置,如果该位置没有元素即直接存储,如果已经有了,就存在两个两种情况,1.hashcode相同,key相同,则直接覆盖原来的值,2如果hash值相同,key不同,则把新元素加到entry链条当中去。也可以说数组为了让查询更快,链表是为了解决hash冲突。

2.Hashmap是怎么解决hash冲突的?

冲突的产生是由于不同对象的hashCode()方法返回了一样的值。这就导致存储位置会一样,于是HashMap通过链地址法使相互碰撞的所有value形成一个链表。在jdk1.8之后做了改进,用常量TREEIFY_THRESHOLD来控制是否切换到平衡二叉树来存储,目前,这个常量值是8,这意味着当有超过8个元素的索引一样时,HashMap会使用树来存储它们。

3.HashMap什么进行扩容呢?

HashMap默认的加载数组大小为16,加载因子的默认值为0.75,当HashMap中元素的个数超过16*0.75=12时,就会把数组大小扩大为原来的一倍。然后重新计算每个元素在数组当中的位置(扩容是需要复制,复制是非常耗能,如果能预知容量大小,并且才创建对象预设元素个数,可以提高HashMap的性能。)

4.如何保证HashMap的现场安全?

HashMap不是线程安全的,如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronizedMap获得线程安全的HashMap。
Map map = Collections.synchronizedMap(new HashMap());

参考自:
HashMap的实现原理及hash冲突(碰撞)解决方法
jdk1.7与1.8解决Hash冲突方法

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

HashMap面试相关问题 的相关文章

随机推荐

  • Angular-官方文档学习-1

    Angular 简介 AngularJS 是一个 JavaScript 框架 它可通过 AngularJS 通过 指令 扩展了 HTML 且通过 表达式 绑定数据到 HTML AngularJS 扩展了 HTML AngularJS 通过
  • 选择文件窗口,获取选择文件地址

    微信公众号原文 系统 Windows 7 软件 Excel 2010 学习路径图 针对之前的学习路径图 会针对的写一些文章 我们在做信息处理的时候 可能会涉及到多个其它文件 有的时候需要根据需求选择所需文件进行处理 今天我们就讲讲如何使用V
  • 软件测试的基本概念

    目录 一 什么是需求 二 什么是测试用例 三 什么是BUG 四 开发模型和测试模型 1 软件开发生命周期 2 软件开发的五大模型 2 1 瀑布模型 2 2螺旋模型 2 3增量模型 迭代模型 2 4 敏捷模型 3 软件测试的两大模型 3 1
  • 一个登录案例学会 Pinia

    Pinia 号称下一代的 Vuex 经过初步体验 发现相比于 Vuex Pinia 确实有了很大进步 最明显的就是删减了复杂的概念 简化了数据流转的过程 现在只剩下了 store state getters actions 这四个核心概念
  • 小白学习python——numpy

    零 初识numpy 1 numPy Numerical Python 即数值Python包 是Python进行科学计算的一个基础包 所以是一个掌握其他Scipy库中模块的基础模块 一定需要先掌握该包的主要使用方式 官网 http www n
  • 猿创征文

    内存管理实现单链表的插入和删除 1 收获 2 什么是单链表 3 节点的创建 4 主函数的实现 5 子函数的实现 5 1 AollocNode的实现 5 2 HeadInsertNode的实现 5 3 ShowNode的实现 5 4 Head
  • KB2871997补丁绕过

    KB2871997补丁绕过 微软为了防止用户的明文密码在内存中泄露 发布了KB2871997补丁 关闭了Wdigest功能 Windows Server2012及以上版本默认关闭Wdigest 使攻击者无法从内存中获取明文密码 Window
  • 24. 两两交换链表中的节点

    给你一个链表 两两交换其中相邻的节点 并返回交换后链表的头节点 你必须在不修改节点内部的值的情况下完成本题 即 只能进行节点交换 输入 head 1 2 3 4 输出 2 1 4 3 示例 2 输入 head 输出 示例 3 输入 head
  • php 验证只能输入姓名,php 检查输入用户名是否符合规定示例

    这篇文章主要为大家详细介绍了php 检查输入用户名是否符合规定示例 具有一定的参考价值 可以用来参考一下 对php检查输入的用户名是否符合规定感兴趣的小伙伴 下面一起跟随512笔记的小编两巴掌来看看吧 php检查输入的用户名是否符合规定 p
  • 【热门框架】Mybatis-Plus条件查询的三种格式

    Mybatis Plus 提供了三种常用的条件查询方式 分别是 Wrapper QueryWrapper LambdaQueryWrapper Wrapper Wrapper 是一个接口 提供了若干个构造方法 可以用来构建 where 条件
  • C++可变参数模板

    可变参数模板 接受可变数目参数的模板函数或模板类 将可变数目的参数成为参数包 有模板参数包和函数参数包 模板参数包 表示零个或多个模板参数 函数参数包 表示零个或多个函数参数 例如 template
  • 数据挖掘note(1)

    数据挖掘一般分为机器学习和统计学习 大数据学的课程一般是关于机器学习 我们学的浅 主要关于统计学习 示意图如下所示 这是一个大数据时代 但是数据挖掘的利用率不足0 5 可见数据挖掘的空间巨大 问题 数据挖掘对信息安全有什么用 例如从几十万条
  • VTM2.0+360lib-7.0配置环境

    全景视频编码跟普通的视频编码不一样 在VTM平台下还需要配置一个360lib 这里贴一下VTM和360lib的地址 VTM下载地址 360lib下载地址 提示一下 VTM可以直接在网站上下载zip版本 360lib要svn的方法下载 下载下
  • 戏开发unity编译和调试系列:The type or namespace name ‘NativeList<>‘ could not be found

    The type or namespace name NativeList lt gt could not be found are you missing a using directive or an assembly referenc
  • intellij idea如何将基于Springboot的web项目打成war包

    intellij idea如何将基于Springboot的web项目打成war包 详细内容请参看 https ms200 cn p 791
  • flink接入Kafka报错:timeout expired while fetching topic metadata

    简单的flink接入kafka结果报错 代码 create env val env StreamExecutionEnvironment getExecutionEnvironment set parallelism env setPara
  • 测试员不可不知的几款bug管理工具

    根据每个公司性质的不同 规模的不同 所用到的bug管理工具也可能不同 你们用的bug管理工具是什么呢 下面介绍几款主流的bug管理工具 1 JIRA 付费 JIRA JIRA的生产者把JIRA定义为Professional Issue Tr
  • Git:Git中的分支管理

    文章目录 分支是什么 创建分支 分支切换 合并分支 删除分支 合并冲突 合并模式 分支策略 bug分支 强制删除分支 本篇主要总结的是Git中的分支管理 分支是什么 在Git中 一个强大的功能就是分支 由前面的学习可以知道 当我们每次进行c
  • Java中double精度丢失如何处理

    图片来自网络 代码审查 CodeReview 是一种可以有效提高代码质量的方法 他可以帮助团体提高产品代码质量 提高产品的稳定性 更容易维护的代码会带来更少的技术债务 从整体上看 提高了软件开发和迭代的效率 double精度丢失现象 程序开
  • HashMap面试相关问题

    1 HashMap的底层实现原理 HashMap的底层是数组 链表的方式 通过Hash算法决定每个元素的存储位置 当程序执行map put 方法时 系统会调用hashcode 方法来得到他的hash值 通过hash值来确定该元素的存储位置