-
HashMap的数据结构
hashmap 是由数组+链表组合成的数据结构,1.8以后是数组+链表+红黑树,数组的每个地方都存储了key-value这样的对象,在1.7叫Entry 1.8叫Node,HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对和hash值
默认实例化后每个元素里面都是null,在put时候会根据key的hash计算一个index值,如 put(“张飞”,666),这个时候通过hash计算出index的坐标位置:hash(“张飞”) = 1,但是数组的长度是有限的,在有限的长度里面使用hash本身存在概率性问题,也就是容易重复。比如我门哈希的张飞也有可能是这样,hash(“飞张”)=1 也index也等于1,这样坐标为1的数据就会出现一个链表,链表则是主要为了解决哈希冲突而存在的。
jdk1.7
jdk1.8
如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。
这就是hash方法