Teniendo que la clase NameBean.java es la siguiente:
[code]
package com.matoosfe.certification.basico;
public class NameBean
{
private String str;
NameBean(String str ){
this.str = str;
}
/**
* @return the str
*/
public String getStr() {
return str;
}
/**
* @param str the str to set
*/
public void setStr(String str) {
this.str = str;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return getStr();
}
}
[/code]
Cuál es la salida que se muestra al ejecutar el código?
[code]
package com.matoosfe.certification.basico;
import java.util.HashSet;
public class CollClient {
public static void main(String []sss) {
HashSet myMap = new HashSet();
String s1 = new String("das");
String s2 = new String("das");
NameBean s3 = new NameBean("abcdef");
NameBean s4 = new NameBean("abcdef");
myMap.add(s1);
myMap.add(s2);
myMap.add(s3);
myMap.add(s4);
System.out.println(myMap);
}
}
[/code]
Entre las opciones tenemos:
a) das abcdef abcdef
b) das das abcdef abcdef
c) das abcdef
d) abcdef abcdef
Para determinar la respuesta correcta deberiamos referirnos a la definición de la colección utilizado en este caso la interfaz
Set
la cual determina que no se puede tener dos objetos repetidos en la
collection, los cuales para ser añadidos a la collection utilizan el
método
equals con la siguiente sentencia
e1.equals(e2). De lo que podemos puntualizar lo siguiente
- En Java para comparar que dos objetos sean iguales (mismo objeto, misma instancia o referencia) se utiliza el símbolo == que no tiene nada que ver con el contenido.
- En cambio el método equals sirve para comparar que dos objetos sean iguales por lo general en contenido, no el mismo objeto
- Adicionalmente en una collection para que dos elementos sean iguales deben de tener el mismo hashCode
Tomando en cuenta lo mencionado anteriormente se concluye lo siguiente.
La opción b) esta incorrecta porque los objetos s1 y s2 a pesar de
que tienen el mismo contenido, tienen el mismo hascode (el cual es
obtenido en base al contenido) por lo que son iguales, lo que determina
que en la collection del tipo Set solo podria estar uno de ellos. A
continuación se expone la definición del método hashCode de la clase
String donde se puede apreciar lo mencionado.
[code]
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
[/code]
La opción c) esta incorrecta porque las instancias del Objeto
NameBean a pesar de que tienen el mismo contenido no tienen el mismo
hashcode ya que son objetos diferentes, diferentes referencias.
La opción d) esta descartada porque en la collection myMap deberia
existir al menos un elmento del tipo String y del tipo NameBean
Para terminar por la explicaciones anteriormente expuestas a las
anteriores respuestas se concluye que la respuesta correcta es la
a) ya que dos objetos son iguales siempre y cuando sean iguales en contenido y referencia (hasCode)