在HashMap類的方法put
是一個負責添加元素融入到HashMap中和
void addEntry(int hash, K key, V value, int bucketIndex) {
Entry<K,V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
if (size++ >= threshold)
resize(2 * table.length);
}
正如你可以在這個方法中看到的是其中的HashMap是如果閾值有蜜蜂調整:它通過調用一個名爲addEntry的方法,其代碼如下做它n超出了,所以我會嘗試擴展類HashMap併爲put
和addEntry
編寫我自己的方法,以刪除調整大小。喜歡的東西:
package java.util;
public class MyHashMap<K, V> extends HashMap {
private V myPutForNullKey(V 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++;
myAddEntry(0, null, value, 0);
return null;
}
public V myPut(K key, V value) {
if (key == null)
return myPutForNullKey(value);
if (size < table.length) {
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
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;
}
}
modCount++;
myAddEntry(hash, key, value, i);
}
return null;
}
void myAddEntry(int hash, K key, V value, int bucketIndex) {
Entry<K, V> e = table[bucketIndex];
table[bucketIndex] = new Entry<K, V>(hash, key, value, e);
size++;
}
}
您需要自put
和addEntry
寫自己的方法不能被重寫,你還需要爲putForNullKey
做同樣的,因爲它被稱爲內put
。驗證put
需要驗證,如果表已滿,我們不試圖放置一個對象。
當Map已滿並且您嘗試插入另一個元素時會發生什麼? – biziclop 2011-04-08 22:31:53
正如僅供參考,哈希表需要壓縮它們的密鑰空間,因爲您無法保留2^31 * 4字節的內存空間來保存每個可能密鑰的值。因此,散列表通常會截斷散列並將鏈表用於衝突。 loadFactor rougly指示在表開始使用散列的更多位之前鏈接的最大大小。因此,0長度鏈表沒有任何意義:你不能在其中存儲任何東西。 – chacham15 2014-09-12 04:19:29