一.HashMap的整体架构:
1.HashMap是由Entry[]构建而成,每个Entry都是一个单链表用于解决hash值冲突的问题。
二.HashMap的四种构造方法:
1.指定初始容量大小和加载因子的构造方法。
2.指定初始容量大小的构造方法,无论我们指定的容量为多少,构造方法都会将实际容量设为不小于指定容量的2的次方的一个数,且最大值不能超过2的30次方。
3.默认构造函数“加载因子”为默认加载因子0.75,初始容量默认是16,并且容量一定是2的幂次方。
4.包含Map的构造方法。
三.HashMap的put和get方法:
1.HashMap中的Key和Value都可以指定为null。
2.[put:]如果key不为null,则同样先求出key的hash值,根据hash值得出在table中的索引,而后遍历对应的单链表,如果单链表中存在与目标key相等的键值对,则将新的value覆盖旧的value,比将旧的value返回
如果key为null,key为null的键值对永远都放在以table[0]为头结点的链表中,当然不一定是存放在头结点table[0]中。
3.如果key为null,则直接从哈希表的第一个位置table[0]对应的链表上查找。记住,key为null的键值对永远都放在以table[0]为头结点的链表中,当然不一定是存放在头结点table[0]中。
如果key不为null,则先求的key的hash值,根据hash值找到在table中的索引,在该索引对应的单链表中查找是否有键值对的key与目标key相等,有就返回对应的value,没有则返回null。
四.HashMap的扩容方法:
1.如果容量大于(当前Entry.size*加载因子),那么就将数组扩大为原来的2倍。很明显,扩容是一个相当耗时的操作,因为它需要重新计算这些元素在新的数组中的位置并进行复制处理。因此,我们在用HashMap的时,最好能提前预估下HashMap中元素的个数,这样有助于提高HashMap的性能。
五.Hash值所在索引的位置确定:
HashMap中则通过h&(length-1)的方法来代替取模,同样实现了均匀的散列,但效率要高很多,这也是HashMap对Hashtable的一个改进。
六.Entry的数组长度为什么是2的幂:
因为第5条中已经提到,V%(length) == V&(length-1),如果length是偶数的话那么length-1必定是奇数那么和V相与的二进制最后一位奇、偶都有可能是;如果数组长度为奇数,则length-1为偶数,则V&(length-1)相与的必定是偶数位置,那么奇数位置就会空闲则会浪费一半的存储空间,并且碰撞的可能性也会变大。