一、背景
hashmap是高效的基于键值对存储的工具,在数据存储、检索、扩容等方面非常快速,在开源框架中基本都能看到其身影。首先它是基于内存来存储的,存储所用的数据结构为数据和链表,数组具有高效检索的特别,链表便于增删。它解决了这些问题:如果快速的进行存取,当数据量很大的时候。首先它是基于hash算法和数据来实现高效地定位,在java里面,每个对象都有一个对应的hashcode相当于身份证,这个值是int类型的,通过这个hashcode值,我们可以进行hash计算,得到对象在数字中的位置,可以直接查到数据,时间复杂度为o(1),前提是数组上没有链表,当有链表的时候会在链表上逐一进行遍历。另外,当整个数组和链表上的数据达到一定的容量,就会进行扩容了,因为数据量太大之后,会产生很多冲突,导致查询去链表上逐一比较,为了提高速度,会进行扩容来避免冲突,提高检索速度。
二、关键点
1.在使用hashcode的时候,为了避免hash冲突,使用了位运算来使得尽量每一位都能参与到计算
2.进行hash的时候,使用了&运算,而不是用取模,使得处理效率更高了
3.链表上面为了避免太长,使用了红黑树,使得链表能够自动平衡不至于太长
4.是允许key为null的,当为null的时候,存在第一位
三、其他
重写equals方法的时候,记得也要重写hashcode方法,不然在使用hashmap的时候,两个对象本意是以为相等的,但在hashmap中肯能会当做两个对象来存储。
相关内容参考:
https://blog.csdn.net/justloveyou_/article/details/72783008
https://blog.csdn.net/justloveyou_/article/details/62893086
https://www.cnblogs.com/chenssy/p/3521565.html