Cómo implementar hashCode y el método equals

¿Cómo debería implementar hashCode() y equals() para la siguiente clase en Java?

 class Emp { int empid ; // unique across all the departments String name; String dept_name ; String code ; // unique for the department } 

en el botón derecho del mouse de Eclipse, haga clic en -> fuente -> generar hashCode () y equals () le da esto:

 /* (non-Javadoc) * @see java.lang.Object#hashCode() */ @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + (code == null ? 0 : code.hashCode()); return result; } /* (non-Javadoc) * @see java.lang.Object#equals(java.lang.Object) */ @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (!(obj instanceof Emp)) return false; Emp other = (Emp) obj; return code == null ? other.code == null : code.equals(other.code); } 

Seleccioné el código como un campo único

prueba este código, usa org.apache.commons.lang3.builder

 public int hashCode() { return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers append(empid). append(name). append(dept_name ). append(code ). toHashCode(); } public boolean equals(Object obj) { if (obj == this) return true; if (!(obj instanceof Person)) return false; Emp rhs = (Emp) obj; return new EqualsBuilder(). // if deriving: appendSuper(super.equals(obj)). append(name, rhs.name). isEquals(); } 

Guava tiene métodos de ayuda para crearlos. Usted le dice qué campos tomar en consideración y manejará nulos para usted y hará el cálculo del número primo para hashcode.

Los IDE también pueden generarlos en función de los campos que elija.

La ventaja de delegarlo a una herramienta como esa es que obtienes una solución estándar y te preocupes menos por los errores y el mantenimiento de implementaciones variadas repartidas por todo tu proyecto.

Aquí hay un ejemplo del uso de Guava y generado por un plugin IntelliJ: https://plugins.jetbrains.com/plugin/7244?pr=

Si el código es único (es decir, la clave de su negocio), lo mejor es usar únicamente el código para equals y hashCode; es una buena práctica separar la clave comercial (código) de la identificación del objeto (id).

Aquí hay una buena lectura: Documentación de Hibernate: Equals y HashCode (válido no solo para Hibernate)

cualquiera que sea el valor que use en igual para determinar si dos objetos son iguales, son los valores que necesita usar para crear un código hash.

 public boolean equals(Object o) { boolean result = false; if(o instanceof CategoryEnum) { CategoryEnum ce = (CategoryEnum) o; result = ce.toString().equals(name); } return result; } public int hashCode() { int hash = 6; hash += 32 * name.hashCode(); return hash; } 

equals () y hashcode (), tienen muchos lugares diferentes. equals (), si no lo reemplazamos desde Object, ¿representa si dos variables apuntan al mismo montón de objetos?

 public Class Student(){ private int id; private name; public Student(int id,String name){ this.name=name; this.id=id; } public void main(String[] args){ Student A=new Student(20,'Lily'); Student B=new Student(20,'Lily'); boolean flag=A.equals(B)//flag=flase; /* *Although they attribute the same, but they are two different objects, they point to different memory */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (this == obj) { return true; } if (this.getClass() != obj.getClass()) { return false; } Student s=(Student)obj; return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name); } /** *Sometimes even though we Override the equals, but we still can not determine whether the *two objects the same, *In the collection object, such as HashSet, this time we have to Override the hashoCode () */ public int hashCode(){ return id + name.hashCode() ; }