HashMap原理
HashMap:
1.存储结构:
JDK1.7
HashMap底层存储结构是散列表,即数组(散列桶Map.Entry[]) + 单向链表.
JDK8
HashMap底层存储结构是散列表,即数组(散列桶Node[]) + 单向链表 + 红黑树(TreeNode)
加入红黑树的原因:
HashMap存储元素时,如果元素Hash值发生碰撞的次数很多的时候,链表节点增多,查询效率越来越低
所以JDK8中,当链表中节点数量达到8个,即使用红黑树结构替换链表,当红黑树节点数量少于6个时,则更换为链表,加个中间值7是为了防止频繁切换数据结构
2.存取原理(1.7)
key==null
存取都是在数组的第一个元素
key!=null
存:根据key的hashCode计算出在位桶中的位置,然后遍历链表中的节点,有相同的则替换value,没有则新增到链表头部(JDK1.7是头部,1.8是尾部)
取:根据key的hashCode计算出在位桶中的位置,然后遍历链表中的节点,当hashCode相同且key相同则返回
3.扩容机制
当添加元素时,元素数量>=加载因子*容量 且 元素数量不超过Integer.Max_value时 ,即扩容为原size*2
新建数组并将原数组中的数据复制到新数组.