El método put
en la clase HashMap es el encargado de la adición de los elementos en el HashMap y lo hace llamando a un método llamado addEntry qué código es el siguiente:
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);
}
como se puede ver en este método es que el HashMap se cambia el tamaño si el umbral tiene abeja n superado, así que intentaría extender el HashMap clase y escribir mis propios métodos para put
addEntry
y con el fin de eliminar el cambio de tamaño. Algo así como:
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++;
}
}
Usted tendría que escribir sus propios métodos ya put
addEntry
y no puede ser de primer orden y también se tendría que hacer lo mismo para putForNullKey
ya que se llama en el interior put
. Se requiere una validación en put
para verificar que no estamos tratando de poner un objeto si la tabla está llena.
¿Qué sucede cuando el mapa está lleno e intenta insertar otro elemento? – biziclop
Al igual que un FYI, las tablas hash necesitan comprimir su espacio de claves porque no puede reservar 2^31 * 4 bytes de espacio de memoria para mantener el valor para cada clave posible. Por lo tanto, las tablas hash usualmente truncan el hash y usan listas enlazadas para colisiones. El loadFactor muestra el tamaño máximo del enlace antes de que la tabla comience a usar más bits del hash. Por lo tanto, las listas de 0 longitudes no tienen sentido: no se puede almacenar nada en él. – chacham15