HashMap原理简单认识
1. hashMap简单认识
优点:hashMap的存储方式是键值对(键可以包括null),查询速度,存储方便,存储数量最大为十几亿。
缺点:主要是线程不安全,容易在hashmap扩容时形成死循环;
2.hashMap从源码角度简单认识
jdk1.7 使用的数组 + 链表
jdk1.8 使用的数组 + 链表 + 红黑树
分析为什么使用数组 + 链表 + 红黑树:
数组:主要是方便查找,且在内存中是连续的。
链表:主要是方便插入,删除,然而hashMap把两个者有点结合在一起。
红黑树:主要是jdk1.8为了对链表进行优化时,增加的数据结构。那么在它们如何使用的呢? ,可以从put()函数中看出
loadFactor | 负载因子,默认值75% |
threshold | 临界值,超过临界值需要重新分配 |
modCount | 统计删除和修改的次数 |
Entry | 实体类,主要有四个参数组成,分别是key,hash,value,next |
hashmap的构造函数
1.无参构造
2.有参构造
分析hashmap的构造函数:
通过在平时项目观察发现,大部分人都会使用无参的构造函数,因为会有初始值16,那么问题来了,如果我们存储数量大于16 呢,看过源码的人当然会说,需要进行扩容操作,可是数据量比较大的时候是不是申请很多内存空间,把一个数组里面的数据重新放到另一个数组里面去,这样可能比较消耗时间和内存,如果在多线程情况下,是不是容易出现数据问题,我个人观点,提前指定所需要的空间,那么有人会说,我可以知道需要申请多少空间,如果盲目申请内存是不是也会产生浪费,这样的观点是没有错的,但是我这里强调的是,在你大概知道需要多少数据量,应指定所需要申请的空间。
hashmap里面的put操作
addEntry函数:
createEntry:
putForNullKey函数:
分析hashMap里面put方法:
1. 首先初始化数组
2. 判断键是不是null,如果是null,用putForNullKey()来处理
3.