hashmap的理解

107 阅读1分钟

Hashmap有put和get方法实现key value类型的数据存储。

底层的数据结构用到数组,单链表,红黑树(jdk8加入)

底层算法,用到hash算法,对key进行hash算法然后对16取模,得到一个下标,放入数组对应的位置。

如果该位置不存在数据,那么直接数组该位置赋值为该数据。

如果该位置已经存在数据(发生了hash冲突),那么将该数组上的值转换成单链表(解决了hash冲突的问题),并将存在的数据置为头节点,并指向新插入的数据。

如果该位置超过一定阈值(8个),那么将该数组位置上的单链表转化为红黑树结构(解决链表太长,查询过慢的问题)。

数组的优缺点,查询快(找到下标即可),插入删除慢(涉及插入删除元素位置后的所有数据下标改变arraycopy)。

链表的优缺点,插入删除快(只涉及节点指向改变),查询慢(需要从头节点一个个查找,比对hash值)。

红黑树的优缺点,查询快于链表(由于小中大,左中右的结构),插入删除慢于链表(由于要维护小中大左中右的数据结构)。

关于hash数组扩容,首次创建默认大小16,阈值为大小的0.75倍(12)。大小始终为2的幂次方个。发生扩容,同一索引位置的链表可能被打乱,分散开。