HashMap底层实现原理及面试常见问题
HashMap底层源码分析
HashMap在面试中经常被问到,今天就对hashMap的底层源码进行分析和解释
1.HashMap底层采用的存储结构
1.在JDK1.7及之前采用的存储结构是数组+链表
我们知道链表的优点是适合增删,但是存储的数据很多时查找的效率会很低,因此针对查找效率低的问题,对HashMap的存储结构进行了改进。
2.到了JDK1.8之后采用的是数组+链表+红黑树
保留了JDK1.7增删效率高的优点,由于增加了红黑树查找效率也提高了。
(1)首先解释一下什么是红黑树:红黑树是一个自平衡二叉树,查找效率很高。红黑树有以下几个特点:
1)每个节点只有两种颜色:红色或黑色
2)根节点必为黑色
3)每个叶子节点都是黑色的空节点
4)从根节点到叶子节点,不能出现两个红色的节点
5)从任一节点出发,到它下边的子结点的路径包含黑色节点数相同。
2.HashMap实现的原理
HashMap基于hashing的原理,通过提供put()和get()方法来存储和获取对象。
1.put()方法。
当把键值对的值传递给put()方法时,会调用hashCode()方法来计算hashcode,然后找到bucket位置来存储。
2.get()方法。
当要获取对象时,通过键对象的equals方法找到正确的键值对,然后返回值。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在下一个节点中。
3.HashMap源码分析
1.默认的初始化容量为16(2的n次幂),最大容量为2^30
2.默认的加载因子0.75,乘以数组容量得到的值用来表示元素个数达到多少时需要扩容
*0.75的原因:
(1)若小于0.75,如0.5,则数组长度达到一半大小就扩容,空间使用率降低;
(2)若大于0.75,如0.8,则会增大hash冲突的概率,影响查询的效率。
3.当链表的长度超过8时,转化为红黑树。
4.当红黑树上的元素个数减少到6个时就退化为链表;
5.链表转化为红黑树,除了有阈值的限制,还有一个限制:数组容量至少达到64,才会树化,这是为了避免数组扩容和树化阈值之间的冲突。
6.HashMap的源码如下(来源于知乎):
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable {
// 序列号
private static final long serialVersionUID = 362498820763181265L; // 默认的初始容量是16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 最大容量:2^30,超过仍按2^30来算
static final int MAXIMUM_CAPACITY = 1 << 30; // 默认的填充因子(负载因子/加载因子)
static final float DEFAULT_LOAD_FACTOR = 0.75f; // 当桶(bucket)上的结点数大于这个值时会转成红黑树
static final int TREEIFY_THRESHOLD = 8; // 当桶(bucket)上的结点数小于这个值时树转链表
static final int UNTREEIFY_THRESHOLD = 6; // 桶中结构转化为红黑树对应的table的最小大小
static final int MIN_TREEIFY_CAPACITY = 64; // 存储元素的数组,总是2的幂次倍
transient Node<k,v>[] table; // 下面会分析结构源码 // 存放具体元素的集
transient Set<map.entry<k,v>> entrySet; // 存放元素的个数,注意这个不等于数组的长度。
transient int size; // 每次扩容和更改map结构的计数器
transient int modCount; // 临界值 当实际大小(容量*填充因子)超过临界值时,会进行扩容
int threshold; // 加载因子
final float loadFactor;
}
原文章:https://blog.csdn.net/weixin_48929324/article/details/112100700
HashMap底层实现原理及面试常见问题的更多相关文章
- 【转载】HashMap底层实现原理及面试问题
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- HashMap底层实现原理及面试问题
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- Java面试必问之Hashmap底层实现原理(JDK1.7)
1. 前言 Hashmap可以说是Java面试必问的,一般的面试题会问: Hashmap有哪些特性? Hashmap底层实现原理(get\put\resize) Hashmap怎么解决hash冲突? ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别(转)
HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别 文章来源:http://www.cnblogs.com/beatIteWeNerverGiveU ...
- Java面试必问之Hashmap底层实现原理(JDK1.8)
1. 前言 上一篇从源码方面了解了JDK1.7中Hashmap的实现原理,可以看到其源码相对还是比较简单的.本篇笔者和大家一起学习下JDK1.8下Hashmap的实现.JDK1.8中对Hashmap做 ...
- HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- Java中HashMap底层实现原理(JDK1.8)源码分析
这几天学习了HashMap的底层实现,但是发现好几个版本的,代码不一,而且看了Android包的HashMap和JDK中的HashMap的也不是一样,原来他们没有指定JDK版本,很多文章都是旧版本JD ...
- (转)HashMap底层实现原理/HashMap与HashTable区别/HashMap与HashSet区别
①HashMap的工作原理 HashMap基于hashing原理,我们通过put()和get()方法储存和获取对象.当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算h ...
- HashMap底层实现原理(JDK1.8)源码分析
ref:https://blog.csdn.net/tuke_tuke/article/details/51588156 http://www.cnblogs.com/xiaolovewei/p/79 ...
随机推荐
- hdu4971 流-最大权闭包
题意: 给了一些任务,然后给了一些完成某些任务的限制,然后又给了限制之间的拓扑关系,最后问你最大收益. 思路: 很直白,就是流的一个应用,最大权闭包,没涉及到什么想法的地方,建 ...
- 【opencv】Java+eclipse+opencv 环境搭建 helloword入门demo
文章为博主原创,纯属个人理解,如有错误欢迎指出. 如需转载,请注明出处. 引入jar包 引入配置文件 到此环境配置完成!!! 可能会出现的问题: 1. jdk版本不一致导致发生异常.如图 build ...
- IDEA 新建 Java 项目 (图文讲解, 良心教程)
IDEA 新建 Java 项目 (图文讲解, 良心教程) 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章, 关注回复「资源」, 免费领取全网最热的Java架构师学习PDF, 转载 ...
- ThreadLocal不好用?那是你没用对!
在 Java 中,如果要问哪个类使用简单,但用好最不简单?我想你的脑海中一定会浮现出一次词--"ThreadLocal". 确实如此,ThreadLocal 原本设计是为了解决 ...
- Centos7下搭建gitbook环境踩坑记录
1.安装npm yum -y install npm 2.配置npm仓 npm config set registry https://mirrors.tencent.com/npm/ 3.安装git ...
- 语音降噪论文“A Hybrid Approach for Speech Enhancement Using MoG Model and Neural Network Phoneme Classifier”的研读
最近认真的研读了这篇关于降噪的论文.它是一种利用混合模型降噪的方法,即既利用了生成模型(MoG高斯模型),也利用了判别模型(神经网络NN模型).本文根据自己的理解对原理做了梳理. 论文是基于" ...
- JAVA并发(2)-ReentrantLock的见解
上节,我们讲了AQS的阻塞与释放实现原理,线程间通信(Condition)的原理.这次,我们就讲讲基于AQS实现的ReentrantLock(重入锁). 1. 介绍 结合上面的ReentrantLoc ...
- Jekyll+GitHub Pages部署自己的静态Blog
混了这么久,一直想拥有自己的博客,通过jekyll和GitHub Pages捣腾出了自己的博客(https://www.ichochy.com) 一.安装jekyll 首先有安装Ruby的开发环境 运 ...
- [Web] 计算机网络课程(一)
局域网 覆盖范围小,自己花钱买设备,自己单位维护 线长不超过100米,带宽固定(10M 100M 1000M) 星形结构,上层交换机口少,但每个口带宽高 广域网 距离远 如在家通过ADSL拨号上网,或 ...
- 利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶
一.准备!!! 1.使用拥有足够权限的IAM账号登录AWS控制台 2.创建S3存储桶,给存储桶命名如"my-bucket"(如果使用已有存储桶,本步骤可略过) 3.有该S3存储桶访 ...