/** 
    * Returns the value to which the specified key is mapped, 
    * or {@code null} if this map contains no mapping for the key. 
    * 
    * <p>More formally, if this map contains a mapping from a key 
    * {@code k} to a value {@code v} such that {@code (key==null ? k==null : 
    * key.equals(k))}, then this method returns {@code v}; otherwise 
    * it returns {@code null}.&nbsp; (There can be at most one such mapping.) 
    * 
    * <p>A return value of {@code null} does not <i>necessarily</i> 
    * indicate that the map contains no mapping for the key; it's also 
    * possible that the map explicitly maps the key to {@code null}. 
    * The {@link #containsKey containsKey} operation may be used to 
    * distinguish these two cases. 
    * 
    * @see #put(Object, Object) 
    */
    public V get(Object key) { 
    if (key == null) 
    return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
    e != null; 
    e = e.next) { 
    Object k; 
    if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
    return e.value; 
    } 
    return null; 
    }

上面的代码看起来跟put()方法很像,除了if (e.hash == hash && ((k = e.key) == key || key.equals(k)))。

注意点

存储Entry对象的数据结构是一个叫做Entry类型的table数组。

数组中一个特定的索引位置称为bucket,因为它可以容纳一个LinkedList的第一个元素的对象。

Key对象的hashCode()需要用来计算Entry对象的存储位置。

Key对象的equals()方法需要用来维持Map中对象的性。

get()和put()方法跟Value对象的hashCode和equals方法无关。

null的hashCode总是0,这样的Entry对象总是被存储在数组的第一个位置