网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
摘要
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
HashMap是Java程序员使用最频繁的的用于键值对(key value)数据处理的容器,在JDK1.7(Java Developmet Kit)时HashMap采取的是数组+链表的形式存储数据,JDK1.8对HashMap进行了存储结构上的优化,引入了红黑树数据结构,极大的增强了HashMap的存取性能!为什么会引入红黑树呢?因为HashMap存在一个问题,即使负载因子和Hash算法设计的再合理,也无法避免出现在链表上拉链过长的问题,如果极端情况下出现严重的Hash冲突,会严重影响HashMap的存取性能,于是HashMap在jdk1.8时,引入了红黑树,利用红黑树快速增删改查的特点来优化了HashMap的性能!
简介
Java为数据结构中的映射(键值对)定义了一个接口java.util.Map,这个接口有四个我们在开发中使用较为频繁的实现类,分别是HashMap<K, V>、Hashtable<K, V>、LinkedHashMap<K,V>、TreeMap<K,V>
序号 | 实现类 | 特点 |
---|---|---|
1 | HashMap<K, V> | 1、根据键的hashcode存储数据2、允许一条记录的key为null,允许多条记录的value为null3、非线程安全 |
2 | Hashtable<K, V> | 1、线程安全2、性能较低,需要使用的场景可以用ConcurrentHashMap替换 |
3 | LinkedHashMap<K,V> | 1、访问具有顺序性,保存了插入顺序2、可以通过构造函数入参来使其按照访问次序排序 |
4 | TreeMap<K,V> | 1、有序Map,可以通过排序比较器来自定义存储数据的排序规则,默认按照key的生序排列2、使用时key需要实现Comparable接口或者通过构造函数传入自定义Comparator |
存储结构
jdk1.8以后HashMap采用数组+链表/红黑树的方式来存储数据
源码分析
主干
// HashMap的主干,也就是上面的绿色部分,是一个Node<K,V>数组,每个Node包含一个K-V键值对
transient Node<K,V>[] table;
节点元素
// Node<K,V>是HashMap的静态内部类,实现了Map接口中的内部Entry接口
static class Node<K,V> implements Map.Entry<K,V> {
// 记录当前Node的key的hash值,可以避免重复计算,空间换时间
final int hash;
// 键
final K key;
// 值
V value;
// 存储指向下一个Entry的引用,是单向链表结构
Node<K,V> next;
// ...
}
其他重要字段
// 默认的初始容量 16
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// 最大容量,1左移30位
static final int MAXIMUM_CAPACITY = 1 << 30;
// 默认扩容因子 0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// 链表转红黑树的链表长度
static final int TREEIFY_THRESHOLD = 8;
// 红黑树转链表的阈值
static final int UNTREEIFY_THRESHOLD = 6;
// 链表转红黑树的数组长度
static final int MIN_TREEIFY_CAPACITY = 64;
// 实际存储K-V键值对的个数
transient int size;
// 记录HashMap被改动的次数,由于HashMap非线程安全,modCount可用于FailFast机制
transient int modCount;
// 扩容阈值,默认16\*0.75=12,当填充到13个元素时,扩容后将会变为32,
**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
![](https://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
![img](https://img-blog.csdnimg.cn/img_convert/37b332378db839038a6da10ec792ffb1.png)
![img](https://img-blog.csdnimg.cn/img_convert/2004111dd5863633a2c36cab37d512d6.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**
**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[需要这份系统化的资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618636735)**