涉及数据结构
- 红黑树
- 链表
哈希
从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中。
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的