public V put(K key, V value){
// 如果 key 为 null,调用 putForNullKey 方法进行处理 if(key == null)returnputForNullKey(value);// 根据 key 的 hashCode() 计算 Hash 值 int hash =hash(key.hashCode());// 搜索指定 hash 值在对应 table 中的索引 int i =indexFor(hash, table.length);// 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素 for(Entry<K,V> e = table[i]; e != null; e = e.next){
Object k;// 找到指定 key 与需要放入的 key 相等(hash 值相同,通过 equals 比较返回 true) if(e.hash == hash &&((k = e.key)== key || key.equals(k))){
V oldValue = e.value;
e.value = value;
e.recordAccess(this);return oldValue;}}// 如果 i 索引处的 Entry 为 null,表明此处还没有 Entry
modCount++;// 将 key、value 添加到 i 索引处 addEntry(hash, key, value, i);return null;}
2.2 get方法
通过key获取value
V get(Object key);
2.2.2 get 实现原理
v = map.get(k)实现原理: 先调用k的hashCode()方法得出哈希值,通过哈希算法(函数)将哈希值转换成数组的下标,通过数组的下标快速定位到某个位置上,如果这个位置上什么也没有,则返回null,如果这个位置上有单向链表,那么会拿着参数k和单向链表上的每一个节点中的k进行equals()比较,如果所有equals()方法返回false,那么get方法返回null,只要其中有一个节点的k和参数k在equals()比较时返回true,那么此时这个节点的value就是所要得到的value,get方法返回此value