在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