最近面试被问到了hashmap源码,所以再次认真学习整理一下(基于jdk1.7)。
hashmap主要由数组和链表组成,数组是hashmap的主体,链表是为了解决hash冲突而设计的。entry是hashmap的基本组成单元。每个entry包含一对key-value的键值对。
entry主要包括四个属性,key,value,hash,entry<K,V> next,其中hash为key进行hash运算后的值,next为下一个entry的引用,当next为null时不存在hash冲突。当hash查找时若next为null,直接返回当前value,若next不为空,则进行链表遍历并比较key实体,查找指定的key。
size:键值对数量
capacity:数组大小。默认初始值为16。扩容大小为2的n次方。
threshold:数组扩容的阀值。capacity*loadfactor,当数组长度超过阀值,数组进行扩容。
loadFactor:数组填充度,默认0.75
当调用put方法时,先判断是否需要扩容,然后判断hash是否冲突,若没有冲突则生成新的节点并放入数组中。如果冲突则进行遍历链表,如果链表中已经存在key则直接进行替换,否则在链表结尾新增节点。
调用get方法时类似,先对key进行hash计算,然后找到key对应的数组下标,遍历链表取值。
jdk1.8对hashmap进行了优化,主要修改部分为entry换为node,当链表长度超过8时采用红黑树结构。
未完待续...