hashmap源码面试分析
HashMap源码问题解析
- 问: 说一说对hash的理解
答: hash是对任意长度的输入输出为相同长度的输出 - 问: hash算法的问题
答: hash冲突问题 - 问: hash冲突是否可以避免
答: 不可以避免,只能尽量规避 - 问: 优秀的hash算法有什么特性
答: 1. 任何微小的变化hash的结果都不相同
2. hash不可逆
3. 长字符串的hash效率要高
4. hash值尽量散列平均
5. 相同的值hash值相同 - 问: hashmap的数据结构
答: 以1.8为例 数组+链表+红黑树 数据存储在node对象中,node中有key value next hash等字段 - 问: 散列表的初始长度是多长
答: 默认是16 - 问: 散列表是什么时候创建
答: 第一次put的时候创建(懒加载) - 问: 默认的负载因子是多少,负载因子的作用
答: 空参构造创建的hashmap的负载因子是0.75,作用是当node数量大于数组长度的0.75的时候进行resize扩容 - 问: 链表转化红黑树需要什么条件
答: 需要两个条件 链表长度大于等于7并且数组的长度大于等于64才进行树化 - 问node对象的hash值是怎么得来的,为什么这么操作
答: 是根据key的hashcode值在与key的hashcode的高16位异或操作得来的,是为了在数组中分布的更加随机均匀,因为hashmap的数据计算数组下标的方法是(tab.length-1)&hash,tab.length大部分情况下小于2^16也就是25536(规则表明tab.length必须是2的次方数) 所以大部分情况下是hash的低16位参与运算,为了让hash更加随机均匀,多一次与key的hashcode异或运算来加强hash值的随机分布,让hashcode没一位都参与到运算中 - 问: hashmap put方法的详细流程
答: key经过寻址查到在数组中的下标
1. 如果数组下标为null直接存入node
2. 如果不为空比较值 相同覆盖 如果是树则按红黑树规则放入 如果不是树 进行尾插链表长度大于等于7并且数组长度大于64转树 长度超过阈值resize - 问: 红黑树的原则
答: 1. 叶子节点到根节点的路径黑色节点数量一致(黑高)
2. 叶子节点都是黑色的
3. 不能有两个红色的节点相连
4. 根节点一定是黑色的
5. 插入的节点一定是红色的(红插) - 问: jdk1.8hashmap为什么引入红黑树
答: 因为链表太长的话会导致查询效率降低hash的目的是尽量实现o(1)的,链接寻址很慢 - 问: hashmap什么时候会触发扩容
答: put操作的时候,有个字段记录数据量当大于扩容阈值的时候扩容 - 问: hashmap怎么扩容
答: 数组长度一定是2的次方数,每次扩容是原先长度左移一位<<1 - 问: 老数组的数据怎么迁移到新数组中
答: 1. hash未冲突的直接根据新的数组长度计算放入即可
2. 如果已经成红黑树
3. 已经是链表未成树会hash&旧数组长度(oldcap) 等于0的放低链 不等于的放高链 低链的放原来的index 高链放原来的index+oldlength的位置
解释:在hashmap寻址算法计算得出(hash&(length-1)) 一条链表的数据肯定会分成两个链表 位置一个是原index 另一个是原index+oldlength
原先的length长度为16 二进制为10000 那么length就是16-1 =15(1111)就是hash&1111 以第15个桶为例,那么hash的值就可能是01111或者11111
扩容后length变为32 二进制为100000 hash&11111 那么如果15这个桶位置原先hash是01111的node就放在他原先的15的这个位置,hash为11111的就放在
32这个桶的位置
01111 & 10000 = 0 这个放15这个位置
11111 & 10000 != 0 放32 15+16 = 31这个位置
hashmap源码面试分析的更多相关文章
- HashMap源码实现分析
HashMap源码实现分析 一.前言 HashMap 顾名思义,就是用hash表的原理实现的Map接口容器对象,那什么又是hash表呢. 我们对数组都很熟悉,数组是一个占用连续内存的数据结构,学过C的 ...
- HashMap 源码详细分析(JDK1.8)
一.概述 本篇文章我们来聊聊大家日常开发中常用的一个集合类 - HashMap.HashMap 最早出现在 JDK 1.2中,底层基于散列算法实现.HashMap 允许 null 键和 null 值, ...
- [Java] HashMap 源码简要分析
特性 * 允许null作为key/value. * 不保证按照插入的顺序输出.使用hash构造的映射一般来讲是无序的. * 非线程安全. * 内部原理与Hashtable类似. 源码简要分析 pu ...
- [java源码解析]对HashMap源码的分析(二)
上文我们讲了HashMap那骚骚的逻辑结构,这一篇我们来吹吹它的实现思想,也就是算法层面.有兴趣看下或者回顾上一篇HashMap逻辑层面的,可以看下HashMap源码解析(一).使用了哈希表得“拉链法 ...
- Java集合之HashMap源码实现分析
1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作 ...
- [java源码解析]对HashMap源码的分析(一)
最近有空的时候研究了下HashMap的源码,平时我用HashMap主要拿来当业务数据整理后的容器,一直觉得它比较灵活和好用, 这样 的便利性跟它的组成结构有很大的关系. 直接开门见山,先简要说明一下H ...
- HashMap源码分析(一)
前言:相信不管在生产过程中还是面试过程中,HashMap出现的几率都非常的大,因此有必要对其源码进行分析,但要注意的是jdk1.8对HashMap进行了大量的优化,因此笔者会根据不同版本对HashMa ...
- Java中的HashMap源码记录以及并发环境的几个问题
HashMap源码简单分析: 1 一切需要从HashMap属性字段说起: /** The default initial capacity - MUST be a power of two. 初始容量 ...
- LinkedHashMap 源码详细分析(JDK1.8)
1. 概述 LinkedHashMap 继承自 HashMap,在 HashMap 基础上,通过维护一条双向链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题.除此之外,Linke ...
随机推荐
- Centos-rpm二进制包安装-rpm
rpm 软件包管理器 rpm包命名规范 mysql-community-server-5.7.21-1.el7.x86_64.rpm 软件名称 mysql-community-server 软件版本 ...
- 剑指offer-递归和循环
1. 斐波那契数列 解: 没啥好说的了,直接上高效的滚动迭代解法.矩阵解法和特征根解法这里不讨论了. class Solution: def Fibonacci(self, n): # write c ...
- makefile实验三 理解make工作的基本原则
代码简单,但测试花样多,若能回答对本博客的每个步骤的预期结果,可以说对makefile的基础掌握是扎实的. 一,当前的makefile代码 root@ubuntu:~/Makefile_Test# r ...
- Python3基础——递归
递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归函数的优点是定义简单,逻辑清晰.理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰. 使用递归函数需要注意防止栈 ...
- 固件(Firmware)
来源:https://baike.baidu.com/item/%E5%9B%BA%E4%BB%B6/627829 固件 固件(Firmware)就是写入EPROM(可擦写可编程只读存储器)或EE ...
- JVM内存布局(又叫Java运行时数据区)
JVM 堆中的数据是共享的,是占用内存最大的一块区域. 可以执行字节码的模块叫作执行引擎. 执行引擎在线程切换时怎么恢复?依靠的就是程序计数器. JVM 的内存划分与多线程是息息相关的.像我们程序中运 ...
- 1-kubeadm部署1.18.0单master集群
1.有了docker,为什么还用kubernetes? 访问工具层 帮助用户更高效的完成任务,包括web控制台.RESTfulAPI.CI/CD.监控管理.日志管理 PaaS服务层 为开发.测试和运维 ...
- 微信小程序中使用 npm包管理 (保姆式教程)
打开自己的微信小程序项目,在勾选这个选项 然后在第一次应该是失败的提示"没有找到可以构建的npm包". 在 小程序的根目录下比如我的项目如图: 右击鼠标在终端中打开. 然后输入:n ...
- MeteoInfoLab脚本示例:中文处理
在脚本中使用中文需要指明是unicode编码,即在含有中文的字符串前加u,比如:u'中文'.还需要将字体指定为一种中文字体.详见下面的例子.脚本程序: x = [1,2,3,4] y = [1,4,9 ...
- XUEXI0.4
1.堆是一种内存管理方式,堆和栈是没有关联的.由于内存的容量很大,并且内存需求在时间和空间上没有规律,所以对操作系统来说,管理内存是非常复杂的. 2.堆这种内存管理方式特点是自由.堆内存是由操作系统划 ...