【数据结构学习】关于HashMap的那些事儿

HashMap UML

涉及数据结构

  • 红黑树
  • 链表
  • 哈希

    从CRUD说起

    预热知识:
    DEFAULT_INITIAL_CAPACITY = 1 << 4, HashMap默认容量为16(n << m意思是n*2^m)
    MAXIMUM_CAPACITY = 1 << 30最大容量,2^30即10,7374,1824.
    DEFAULT_LOAD_FACTOR = 0.75f负载因子0.75,扩容时需要用到
    TREEIFY_THRESHOLD = 8
    ---

    The table, initialized on first use, and resized as necessary. When allocated, length is always a power of two. (We also tolerate length zero in some operations to allow bootstrapping mechanics that are currently not needed.)
    首次使用时初始化,必要时进行调整。调整之后的容量通常为2的次幂。(在一些操作中也允许长度为零,以允许当前不需要的自举机制)

Node<K,V>[] table 存储KV对

The next size value at which to resize (capacity * load factor).

threshold:因为牵涉到扩容,而map的扩容(即对table进行扩容操作)不是到了存满了才扩,是以容量*负载因子作为临界点进行扩容的。


resize()方法

调整map的大小,实现map初始化或扩展为原有尺寸的二倍。
HashMap默认大小16,当存储了12个的时候,如果再put,会先将新的值存于原来的map中,然后发现++size > threshold(这里是12),就会进行调整resize。调整的时候,新的table会变成32,threshold变成24,并且需要将原有的值复制进新的table中。

扩容为原来大小的2倍代码

int hash(Object key)

key == null,hash为0;否则,(h = key.hashCode()) ^ (h >>> 16)即计算hashCode,与hashCode右移16位(除以65536得到的商)做异或(同0异1)运算。
计算单个字符的hash结果就是对应的ASCII码,例如hash('a')=97

V put(K key, V value)

put是允许key为null的
put操作

get

image.png

猜你喜欢

转载自www.cnblogs.com/studentytj/p/9657313.html