//每次都用新的节点指向链表的头结点。新节点作为链表新的头结点staticclassEntry<K,V>implementsMap.Entry<K,V>{final K key;
V value;
Entry<K,V> next;// 下一个entry节点finalint hash;......}
put方法:
/*
* 1. 通过key的hash值确定table下标
* 2. 查找table下标,如果key存在则更新对应的value
* 3. 如果key不存在则调用addEntry()方法
*/public V put(K key, V value){if(key == null)returnputForNullKey(value);//此方法见下面int hash =hash(key.hashCode());//计算hashint i =indexFor(hash, table.length);// 查找对应的数组下标//判断key是否已存在,存在的话替换value,并返回旧的value值for(Entry<K,V> e = table[i]; e != null; e = e.next){
Object k;if(e.hash == hash &&((k = e.key)== key || key.equals(k))){
V oldValue = e.value;
e.value = value;
e.recordAccess(this);return oldValue;}}// 没有在相同hash值的链表中找到key相同的节点
modCount++;addEntry(hash, key, value, i);// 在i位置对应的链表上添加一个节点return null;}private V putForNullKey(V value){//判断key为null是否已存在,存在的话替换value,并返回旧的value值for(Entry<K,V> e = table[0]; e != null; e = e.next){if(e.key == null){
V oldValue = e.value;
e.value = value;
e.recordAccess(this);return oldValue;}}
modCount++;addEntry(0, null, value,0);// 在数组0位置对应的链表上添加一个节点return null;}voidaddEntry(int hash, K key, V value,int bucketIndex){
Entry<K,V> e = table[bucketIndex];
table[bucketIndex]=newEntry<>(hash, key, value, e);//判断是否需要扩容if(size++>= threshold)resize(2* table.length);}staticinthash(int h){// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).
h ^=(h >>>20)^(h >>>12);return h ^(h >>>7)^(h >>>4);}