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;
}
}[uno,dos,tres][uno,uno,dos,dos][dos,dos,uno]- No hay garantía del orden.
- Error de ejecución
Ver la respuesta
Respuesta: d.
java Test[dos, uno, dos]
Hay tres cosas que mirar:
s1ys2son objetos distintos, peroStringdefineequalsyhashCodepor contenido, así que el conjunto los ve iguales y solo guarda uno.CadenaBeanno redefine ninguno de los dos y usa los deObject, que comparan identidad. Los dos"dos"cuentan como distintos y entran ambos.s5se 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<>();.
Más preguntas de Java
- El orden de un HashSet
- wait() sin el monitor correcto
- start() con un argumento
- Dos hilos y una variable compartida
- wait() fuera de synchronized
- Leer más allá del final de un archivo
- binarySearch con null
- Serializar una clase cuyo padre no es Serializable
- Clases internas anidadas
- Llamar a run() en vez de start()
- Un assert que nunca falla
- Campos transient al serializar
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.
respuesta a
Amigo en ningun momento se agregó el elemento s5.
Es la B, porque se agrego elementos S1, S2, S3, S4.
El S1 y el S2 su equals es true por lo que el Set no permite duplicados.
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
la respuesta es la b
B
La respuesta es D , CadenaBean marca error : non-static variable this cannot be referenced from a static context. Por lo que debe de ser public static CadenaBean , y en este caso imprimiría [dos, dos, uno]
Al momento de generar un new dentro de un contexto static es posible utilizar las clases, porque no inner class si revisa bien las llaves!
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.
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.
por ese motivo añade una sola vez "uno" y muestra dos veces "dos"