tutorial query puertos indice documentacion crear java hash hashcode hashset

java - query - logstash tutorial



Java: ¿Se agregan objetos duplicados para establecer? (3)

La anotación de @Overrides es anular el método con el mismo nombre en la súper clase ".

@Override public int hashCode() { return a; } @Override public boolean equals(Object obj) { return (obj instanceof Alpha && ((Alpha) obj).a == this.a); } @Override public String toString() { return "Alpha : " + a; }

Si ejecuto el siguiente código, la salida es 2, lo que significa que el conjunto contiene 2 elementos. Sin embargo, creo que ese conjunto debería contener 1, ya que ambos objetos son iguales en función del valor de hashcode () y del método .equals() . Parece un error obvio en mi entendimiento?

package HELLO; import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args) throws Exception { Set<Alpha> s = new HashSet<Alpha>(); Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); s.add(a1); s.add(a2); System.out.println(s.size()); } } class Alpha { int a = 10; public int hashcode() { return a; } public boolean equals(Object obj) { return (obj instanceof Alpha && ((Alpha) obj).a == this.a); } public String toString() { return "Alpha : " + a; } }


Su método hash c ode no anula el método hash C ode de la clase Object y, por lo tanto, su método igual rompe el contrato, ya que no está de acuerdo con los resultados de hashCode, y puede tener objetos que son "iguales" pero tienen códigos hash diferentes.

Recuerde: siempre debe utilizar la anotación @Override al anular métodos, ya que esto le ayudará a detectar este error y otros similares.

@Override // ** don''t forget this annotation public int hashCode() { // *** note capitalization of the "C" return a; }

Además, querrá mejorar el formato de su código, especialmente cuando publique el código aquí para nuestra revisión. Podremos entender mejor su código y ayudarlo si cumple con los estándares (es por eso que existen los estándares). Así que trate de mantener sus sangrías consistentes con todas las líneas de código que están en el mismo bloque sangradas al mismo nivel, y querrá estar seguro de que el código de nivel base, incluidas las importaciones, las declaraciones de la clase externa y su corchete rizado final, esté a la izquierda :

import java.util.HashSet; import java.util.Set; public class Test { public static void main(String[] args) throws Exception { Set<Alpha> s = new HashSet<Alpha>(); Alpha a1 = new Alpha(); Alpha a2 = new Alpha(); s.add(a1); s.add(a2); System.out.println(s.size()); } } class Alpha { int a = 10; @Override public int hashCode() { return a; } public String toString() { return "Alpha : " + a; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Alpha other = (Alpha) obj; if (a != other.a) return false; return true; } }

Para una revisión hermosa sobre esto, por favor lea: Anulando equals y hashCode en Java


su código de código de método debe llamarse código hash (mayúscula "C").

Si planea reemplazar métodos, debe usar la anotación @Override .

Si hubieras utilizado esa anotación, habrías notado el problema anteriormente, ya que el código no se habría compilado.