Foros del Web » Programación para mayores de 30 ;) » Java »

Duda con hashcode

Estas en el tema de Duda con hashcode en el foro de Java en Foros del Web. Hola, en este programa, que funcion cumple hashcode?, por que el hashcode se calcula con la numeración 17 y 31?, para calcular el metodo hashcode ...
  #1 (permalink)  
Antiguo 01/12/2008, 20:47
 
Fecha de Ingreso: febrero-2006
Mensajes: 446
Antigüedad: 18 años, 2 meses
Puntos: 3
Duda con hashcode

Hola, en este programa, que funcion cumple hashcode?, por que el hashcode se calcula con la numeración 17 y 31?, para calcular el metodo hashcode debo seguir alguna numeracion especial o en base a que cosa debo calcularlo
gracias

Código PHP:
public final class PhoneNumber
 
{
private final 
short areaCode;
private final 
short prefix;
private final 
short lineNumber;

public 
PhoneNumber(int areaCodeint prefix,int lineNumber
{
rangeCheck(areaCode999"area code");
rangeCheck(prefix999"prefix");
rangeCheck(lineNumber9999"line number");

this.areaCode = (shortareaCode;
this.prefix = (shortprefix;
this.lineNumber = (shortlineNumber;
}

private static 
void rangeCheck(int argint max,
String name) {
if (
arg || arg max)
throw new 
IllegalArgumentException(name +": " arg);
}

@
Override public boolean equals(Object o
{
if (
== this)
return 
true;
if (!(
instanceof PhoneNumber))
return 
false;
PhoneNumber pn = (PhoneNumber)o;
return 
pn.lineNumber == lineNumber
&& pn.prefix == prefix
&& pn.areaCode == areaCode;
}

@
Override public int hashCode() {
int result 17;
result 31 result areaCode;
result 31 result prefix;
result 31 result lineNumber;
return 
result;
}

public 
String toString()
{
return 
"("+areaCode+"-"+prefix+"-"+lineNumber+")";
}

public static 
void main(String arguments[])
{
PhoneNumber po= new PhoneNumber(5,222,4);
System.out.println(po);    
}} 

Última edición por -thor-; 01/12/2008 a las 21:14
  #2 (permalink)  
Antiguo 02/12/2008, 01:31
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda con hashcode

Según el propio JDK (http://java.sun.com/j2se/1.5.0/docs/...l#hashCode()):
Cita:
The general contract of hashCode is:

* Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
* If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
* It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hashtables.
Básicamente: Durante la ejecución, dos objetos que sean "equivalentes" (equals devuelve true) han de devolver el mismo entero en el hashCode, y si no se modifica nada que afecte al equals, hashode ha de ser el mismo durante toda la ejecución. Aparte de eso, puedes devolver lo que quieras. De hecho, dos objetos diferentes pueden devolver el mismo hashCode, aunque no es lo recomendable.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 02/12/2008, 11:35
 
Fecha de Ingreso: febrero-2006
Mensajes: 446
Antigüedad: 18 años, 2 meses
Puntos: 3
Respuesta: Duda con hashcode

Cita:
Iniciado por GreenEyed Ver Mensaje
Según el propio JDK (http://java.sun.com/j2se/1.5.0/docs/...l#hashCode()):


Básicamente: Durante la ejecución, dos objetos que sean "equivalentes" (equals devuelve true) han de devolver el mismo entero en el hashCode, y si no se modifica nada que afecte al equals, hashode ha de ser el mismo durante toda la ejecución. Aparte de eso, puedes devolver lo que quieras. De hecho, dos objetos diferentes pueden devolver el mismo hashCode, aunque no es lo recomendable.

S!

Estos objetos que devuelven true en el Equals me deberan devolver el mismo valor en el hashcode, entonces en el hashcode que valor numerico toma areacode, prefix y lineNumber?.
Eso me tiene confundido
Código PHP:
return pn.lineNumber == lineNumber
&& pn.prefix == prefix
&& pn.areaCode == areaCode
Eso quiere decir que acá también podria ocupar 16 y 21 por ejemplo.
Código PHP:
@Override public int hashCode() {
int result 17;
result 31 result areaCode// que valor tendria areaCode, prefix y lineNumber;
result 31 result prefix;
result 31 result lineNumber
  #4 (permalink)  
Antiguo 02/12/2008, 12:57
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda con hashcode

Se supone que esas variables tienen valor, que para eso las has inicializado en el constructor. Tendran el valor... que se les haya pasado en el constructor.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #5 (permalink)  
Antiguo 02/12/2008, 20:54
 
Fecha de Ingreso: febrero-2006
Mensajes: 446
Antigüedad: 18 años, 2 meses
Puntos: 3
Respuesta: Duda con hashcode

Cita:
Iniciado por GreenEyed Ver Mensaje
Se supone que esas variables tienen valor, que para eso las has inicializado en el constructor. Tendran el valor... que se les haya pasado en el constructor.

S!
Muchas gracias por tus respuestas, una ultima consulta, existe alguna manera de saber si mi metodo Equals y hashCode fueron escritos correctamente?. ME refiero si habrá alguna forma de enviar mensajes con system.println o una exception cuando alguno de esos metodos este mal escrito, o como puedo comprobar que este funcionando correctamente.
  #6 (permalink)  
Antiguo 03/12/2008, 01:10
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Duda con hashcode

No es nada que pueda comprobar un compilador ni la JVM lo puede saber por si misma, ya que es una definicion "tuya". ¿Si tu le dices que dos objetos son equivalentes... quien es ella para decir que no lo son?

Teniendo en cuenta que el valor que puede tomar hashCode es bastante grande... la verdad es que saber que es correcto es bastante complicado. Se pueden hacer comprobaciones con unos cuantos casos, pero nada más. El problema en este caso es que la definición de correcto/incorrecto la proporcionas tú, asi que la JVM se basa en lo que tu le dices y no te puede decir que te equivocas.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:39.