HashMap原理简单认识

1. hashMap简单认识

优点:hashMap的存储方式是键值对(键可以包括null),查询速度存储方便存储数量最大为十几亿

缺点:主要是线程不安全,容易在hashmap扩容时形成死循环

2.hashMap从源码角度简单认识

jdk1.7 使用的数组 + 链表

jdk1.8 使用的数组 + 链表 + 红黑树

分析为什么使用数组 + 链表 + 红黑树:

数组:主要是方便查找,且在内存中是连续的。

链表:主要是方便插入,删除,然而hashMap把两个者有点结合在一起。

红黑树:主要是jdk1.8为了对链表进行优化时,增加的数据结构。那么在它们如何使用的呢? ,可以从put()函数中看出

hashmap重要参数
loadFactor 负载因子,默认值75%
threshold 临界值,超过临界值需要重新分配
modCount 统计删除和修改的次数
Entry 实体类,主要有四个参数组成,分别是key,hash,value,next

hashmap的构造函数

    1.无参构造

     HashMap原理简单认识

    2.有参构造

    HashMap原理简单认识

    HashMap原理简单认识

    分析hashmap的构造函数:

  通过在平时项目观察发现,大部分人都会使用无参的构造函数,因为会有初始值16,那么问题来了,如果我们存储数量大于16  呢,看过源码的人当然会说,需要进行扩容操作,可是数据量比较大的时候是不是申请很多内存空间,把一个数组里面的数据重新放到另一个数组里面去,这样可能比较消耗时间和内存,如果在多线程情况下,是不是容易出现数据问题,我个人观点,提前指定所需要的空间,那么有人会说,我可以知道需要申请多少空间,如果盲目申请内存是不是也会产生浪费,这样的观点是没有错的,但是我这里强调的是,在你大概知道需要多少数据量,应指定所需要申请的空间。

hashmap里面的put操作

HashMap原理简单认识

addEntry函数:

HashMap原理简单认识

createEntry:

HashMap原理简单认识

putForNullKey函数:

HashMap原理简单认识

分析hashMap里面put方法:

1.  首先初始化数组

2.  判断键是不是null,如果是null,用putForNullKey()来处理

3.