remove example declarar clase java data-structures hashmap hashset

java - example - Capacidad inicial para un HashSet<Integer>



java clase hashmap (4)

¿Qué capacidad inicial debo usar para un HashSet en el que sé que voy a insertar 1000 enteros para evitar la necesidad de reconstrucciones internas?

Al principio pensé que debería usar 1000 pero al leer la descripción del constructor que toma el parámetro initialCapacity dice Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75). Constructs a new, empty set; the backing HashMap instance has the specified initial capacity and default load factor (0.75). .

Entonces, si configuro la capacidad en 1000, ¿el hashMap cambiará de tamaño cuando alcance 750 elementos?

También supongo que se necesita algún "espacio" para la efectividad de hashMap, por lo que resolver IC * 0.75 = 1000 para obtener algo así como 1334 podría no ser la mejor solución o ¿no?

ACTUALIZAR:
1) Soy consciente de que la implicación del tamaño interno no es significativa, pero aún así es una oportunidad para aprender y comprender mejor el entorno que estoy utilizando. y el esfuerzo debe ser mínimo.

2) Se hicieron varios comentarios con respecto a la elección de la estructura de datos. Por favor, eche un vistazo a mi Q anterior: recomendación de estructura de datos donde se proporciona información más exacta sobre mi escenario.


Creo que la capacidad inicial ideal sería mantenerla en el número de enteros que desea insertar, y el factor de carga se dejará en el valor predeterminado.

ir por <# de enteros> /0.75 factor de carga.


Necesita un size/load-factor para evitar un cambio de tamaño. Nota: siempre será la próxima potencia de 2 para HashSet & HashMap.


Para su caso, es razonable establecer la capacidad inicial en 1000 y el factor de carga en 1, ya que dos Integer diferentes no compartirán el mismo hash (que es la int).

Sin embargo, para un propósito general, no debería preocuparse por el factor de carga y dejarlo tal como está, ya que probablemente nunca notará ninguna mejora configurándolo usted mismo. Aumentar el factor de carga en realidad puede conducir a una disminución dramática en el rendimiento.


Si realmente vale la pena preocuparse por esto (y sospecho que no lo es, cambiar el tamaño de un conjunto de 1000 enteros no llevará mucho tiempo), tenga en cuenta que HashSet está respaldado por un HashMap y el método put referencia a esto :

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); }

Siempre vale la pena consultar el código fuente para tales consultas, aunque tenga en cuenta que la implementación siempre puede cambiar (incluso para versiones menores de JRE).

Finalmente, ¿es un conjunto apropiado para este escenario? Si tiene un tamaño fijo de asignación de enteros, quizás una matriz simple (utilizando primitivas y evitando así el boxeo) sería más rápida / más simple.