Certification Java – Set
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
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)
[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
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)