¿Es seguro HashSet debido a colisiones de hash [duplicado]?
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
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.