hashmap数据结构详解(三)之hashcode实例及大小是2的幂次方解释
hashmap数据结构详解(五)之HashMap、HashTable、ConcurrentHashMap 的区别
(笔者在写项目的时候发现在hashmap的使用中会出现各种bug,还有hashmap的大小是有限的,故彻底理解一下)
【map】
map的形式是“键值对key-value”。
如果有学过《数据结构与算法分析》的话,hash的汉语意思是“散列”。
JDK 1.6及以:hashmap其实是数组+链表的形式。
JDK 1.8:数组+链表+红黑树
(关于红黑树:平衡二叉B树的内容,以后有时间的话再补吧。hashmap中当链表后面元素超过8的时,会创建成为一个红黑树)
见下图:
以上其实也就是Java中常称的“拉链法”,还是蛮形象的。
【hash】
绿色部分是数组形式,黄色部分是链表。假设现在有很多数字(或者地址)
4545,4546,7879,1315,4546,7879,4566,2356,,4456,7896,3569,7897,7879,5654,46789,等等数字。
散列分为两种:闭散列、开散列。
开散列:
下面进行以下操作:将上述数字放入该结构中,按照某种散列函数去进行放置。绿色部分是0—9的序号。第一次探测的时候,该序号没有放,则直接放入。如果已经有了,那么就加在后面的链表中。
闭散列:
将0-9个绿色空间分成2个桶(或其他数目)。外加一个溢出桶。根据探测函数将上述数字分别放入两个桶中,桶中溢出后则,则将相应的放入溢出桶中。
---------------------------------------------------------------------------
--------------------------2018/7/18 修改---------------------------
在基槽之后的链表存储中,hashmap存的是节点形式的值(一个类或者一个结构体的性质)