¿Es seguro HashSet debido a colisiones de hash [duplicado]?

Nov 24 2020
    Set<String> set = new HashSet<>();
    set.add("FB");
    set.add("Ea");
    set.add("G#");
    set.add("FB");
    for(String s : set)
        System.out.println(s.hashCode());

salida:

2236
2236
2236

Mi pregunta es, ¿siempre maneja las colisiones de hash y cómo sabe exactamente que el objeto es diferente si el hash es exactamente el mismo? ¿Verifican iguales? Si es así, eso anula el punto de hash.

En comparación con sha256, que prácticamente no tiene colisiones hash para un programa que estoy haciendo, si usara hashset para cadenas, ¿se estropearía y con qué probabilidad colisionaría String.hashCode () entre sí? Por ejemplo, ¿por qué están usando hash si tanto el método contains como el método add no parecen verificar el hash?

Respuestas

tentacle Nov 24 2020 at 15:59

Un código hash igual no significa que los objetos sean iguales. Según el contrato de colecciones, si dos objetos son iguales, deben tener el mismo código hash, no al revés.

Realmente no importa que los objetos en una colección como set y map tengan colisiones hash, funcionarán correctamente hasta que el método equals pueda distinguir objetos. Aunque el rendimiento puede degradarse, ya que el conjunto se degradará efectivamente a la lista si todos los hashes son iguales.