Pregunta ¿Por qué las estructuras de datos de Set en Java usan Map internamente?


Me pregunto porque hacer HashSet usos HashMap, TreeSet usos TreeMapy LinkedHashSet usos LinkedHashMap Internamente detrás de la escena? ya que Set solo transporta y almacena la clave, pero el valor, por lo tanto, ¿no está usando espacio de memoria adicional como no ser económico?

los Entry clase interna que HashMap tiene es la siguiente

class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;
    ...
    ....
}

Para Set realmente no necesitamos eso V value variable, ¿correcto? Entonces, ¿cuál es el beneficio y la razón principal de usar un objeto de mapa internamente?


5
2017-09-14 20:31


origen


Respuestas:


Menos código, menos errores, menos pruebas.

Al reutilizar el mismo código, solo necesita optimizarlo, depurarlo y probarlo una vez. La sobrecarga de memoria es mínima: otro puntero para cada entrada, insignificante en comparación con la clave.


11
2017-09-14 20:34



El uso de un mapa simplifica el código, pero aumenta ligeramente el uso de la memoria. No es tanto como podría pensar ya que los gastos generales ya son altos. ;)

No todos los mapas tienen conjuntos y puede usar lo siguiente.

Set<T> set = Collection.newSetFromMap(new ConcurrentHashMap<T>());
Set<T> set = Collection.newSetFromMap(new ConcurrentSkipListMap<T>());
Set<T> set = Collection.newSetFromMap(new IdentityHashMap<T>());

3
2017-09-14 20:33