HashMap在日常开发中常用,每次我都只是会使用,没有腾出时间去研究其中得原理,闲暇时间去刨析一下,其get、put方法,做下笔记方便以后复习。
hashmap是怎么来的?首先要知道数组结构,与链表结构。
数组结构
我们日常使用得数组结构特点,空间复杂度高,区间连续,时间复杂O(1)
优点:查询快,原因是因为他通过数组得下标去查询,区间连续,随机查询效率高。
缺点:存储较慢,原因是 区间连续,我们存储到某个下标位置得时候,其后边所有得下标都需要后移,效率较低。
链表结构
特点,空间复杂度低,区间离散,时间复杂度O(N)
优点:存储较快,没有固定大小,内存利用率高。
缺点:查询较慢,原因是每次查询都需要从最开始开始遍历,不能随机查找,效率低。
所以hashmap是集中了数组结构与链表结构得优点,实现查询快,存储快。
put:
是我们插入是后调用得方法,当我们调用.put(k,v)得时候,首先会把k,v封装到一个node节点中,然后调用k得hashCode方法得到hash值,通过hash函数,将hash值转换为数组下标,如果此下标对应得位置上没有元素,则将节点存到该位置,如果有链表,则会拿k去与链表上得每个节点得k去做比较,相同得话就覆盖此链表上得节点,全部不同得话就会,在此链表尾部,新建一个新的节点(k,v得node节点)。这样就完成了一次插入。
get:
我们查询的时候调用得方法,首先会调用k得hashcode方法,得到hash值,然后通过hash函数将hash值转换为数组下标,去该下标中看有没有元素,没有得话返回null,如果该下标对应得位置有单链表,则会去链表拿k去和单链表得每个节点得k做对比,如果有相同得则返回,该节点得值,如果全部比完后没有相同得则返回null,此为一次查询。