Pregunta Java: HashSet sin equals ni hashCode

2 min de lectura

Piensa la respuesta antes de abrirla. Todas las opciones parecen razonables, y casi siempre hay un detalle que lo cambia todo.

Pregunta Java · Collections

¿Cuál es el resultado de compilar y ejecutar la clase Test?

import java.util.HashSet;
public class Test {
    public static void main(String args[]) {
        HashSet hashset = new HashSet();
        String s1 = new String("uno");
        String s2 = new String("uno");
        CadenaBean s3 = new CadenaBean("dos");
        CadenaBean s4 = new CadenaBean("dos");
        CadenaBean s5 = new CadenaBean("tres");
        hashset.add(s1);
        hashset.add(s2);
        hashset.add(s3);
        hashset.add(s4);
        System.out.println(hashset);
    }
}
class CadenaBean {
    private String str;
    CadenaBean(String str) {
        this.str = str;
    }
    public String toString() {
        return str;
    }
}
  1. [uno,dos,tres]
  2. [uno,uno,dos,dos]
  3. [dos,dos,uno]
  4. No hay garantía del orden.
  5. Error de ejecución
Ver la respuesta

Respuesta: d.

java Test[dos, uno, dos]

Hay tres cosas que mirar:

  • s1 y s2 son objetos distintos, pero String define equals y hashCode por contenido, así que el conjunto los ve iguales y solo guarda uno.
  • CadenaBean no redefine ninguno de los dos y usa los de Object, que comparan identidad. Los dos "dos" cuentan como distintos y entran ambos.
  • s5 se crea pero nunca se añade.

Quedan tres elementos, uno, dos y dos, en un orden que HashSet no garantiza. En nuestra ejecución salió [dos, uno, dos], que se parece a la opción c pero no es lo que el código asegura. La respuesta correcta es la d. (La quinta opción también estaba marcada como «d» en la imagen original.)

Al compilar sale además un aviso, Test.java uses unchecked or unsafe operations, por usar HashSet sin tipo. Hoy se escribiría Set<Object> hashset = new HashSet<>();.

Pregunta publicada en 2014 y revisada en octubre de 2026. La respuesta se comprobó compilando y ejecutando el código con Java 25 LTS en un contenedor limpio; las salidas están copiadas de esa ejecución.

12 comentarios en «Pregunta Java: HashSet sin equals ni hashCode»

  1. Donde tengo entendido sería la D, que sería porque los Set no tienen garantizado el orden que se maneja, y si pudiera haber un orden sería la respuesta C ya que el una carateristica de los Set q es que no aceptan repetidos, por lo que el S1 y S2 dos su equals da true por lo que no permite el ingreso en el caso de las clases aunque digan dos como su hashcode es diferente lo permite

    Responder
  2. La respuesta A no puede ser porque en ningún momento se añade s5 al hashset. La respuesta B tampoco puede ser porque s1.equals(s2) == true y los hashset no permiten añadir 2 veces el mismo objeto. La respuesta D no puede ser porque te pregunta por el resultado de compilar y ejecutar la clase y nunca te va a salir "No hay garantía del orden" La respuesta E no puede ser porque el programa no debe dar problemas al ejecutarse, está todo bien programado. La respuesta correcta por tanto es la C.

    Responder
  3. La respuesta es c porque el contenido "uno" se repite dos veces, en cambio CadenaBean no es un String es una clase propia y el contenido de una clase propia no se puede determinar si es igual o no, entonces lo añade, salvo que sobreescribas algun metodo de HashSet que haga la comparacion interna en una clase propia pero por si solo HashSet no lo hace, solo lo hace con los predeterminados, con los que vienen en java o sea, generalmente con los wrapper de los tipos primitivos.

    Responder

Deja un comentario