現在很多的Java程序員都會把HashMap當作一個熱門話題
我假設你對HashMap感興趣
目錄
一句話回答
如果任何人讓我描述一下HashMap的工作機制的話
什麼是哈希
哈希簡單的說就是對變量/對象的屬性應用某種算法後得到的一個唯一的串
當哈希函數應用在相同的對象或者equal的對象的時候
注
關於Entry類的一點介紹
一個map的定義是
所以
static class Entry<K
{
final K key;
V value;
Entry<K
final int hash;
}
當然
put()方法實際上做了什麼
再進一步看put方法的實現之前
/**
* The table
*/
transient Entry[] table;
現在再來看put方法的實現
/**
* Associates the specified value with the specified key in this map
* If the map previously contained a mapping for the key
* value is replaced
*
* @param key key with which the specified value is to be associated
* @param value value to be associated with the specified key
* @return the previous value associated with <tt>key</tt>
* <tt>null</tt> if there was no mapping for <tt>key</tt>
* (A <tt>null</tt> return can also indicate that the map
* previously associated <tt>null</tt> with <tt>key</tt>
*/
public V put(K key
if (key == null)
return putForNullKey(value);
int hash = hash(key
int i = indexFor(hash
for (Entry<K
Object k;
if (e
V oldValue = e
e
e
return oldValue;
}
}
modCount++;
addEntry(hash
return null;
}
讓我們一步一步的看
首先
接著是indexFor(hash
接下來就是主要的部分
答案是LinkedList
所以
如果我們給已經存在的key存入另一個value會怎麼樣的?邏輯上
在這種方式下HashMap就能保證key的唯一性
get方法的工作機制
現在我們已經了解了HashMap中存儲鍵值對的機制
其實邏輯跟put是一樣的
/**
* 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
* {@code k} to a value {@code v} such that {@code (key==null ? k==null :
* key
* it returns {@code null}
*
* <p>A return value of {@code null} does not <i>necessarily</i>
* indicate that the map contains no mapping for the key; it
* 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
*/
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key
for (Entry<K
e != null;
e = e
Object k;
if (e
return e
}
return null;
}
上面的代碼看起來跟put()方法很像
注意點
存儲Entry對象的數據結構是一個叫做Entry類型的table數組
數組中一個特定的索引位置稱為bucket
Key對象的hashCode()需要用來計算Entry對象的存儲位置
Key對象的equals()方法需要用來維持Map中對象的唯一性
get()和put()方法跟Value對象的hashCode和equals方法無關
null的hashCode總是
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26745.html