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

新建数组并将原数组中的数据复制到新数组.

 

posted @ 2018-02-26 14:23  jiabei  阅读(129)  评论(0编辑  收藏  举报