Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.
Sobreescritura del equals
class Punto2D{
private int x;
private int y;
private String nombre;
public Punto2D(int x, int y, String nombre) {
super();
this.x = x;
this.y = y;
this.nombre=nombre;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof Punto2D)) return false;
Punto2D punto = (Punto2D) o;
return (x == punto.x) && (y == punto.y);
}
}
Ejercicio
Hacer una clase llamada Deposito que tiene un nombre, un largo, un ancho y un alto.
Hacer un método equals que devolverá true cuando dos depósitos tengan el mismo volumen (largo*ancho*alto).
Sobreescritura del hashcode
Si sobrescribes el método equals(), es recomendable sobrescribir también el método hashCode() para mantener el contrato entre ambos métodos: dos objetos iguales deben retornar el mismo valor de hash.
El método equals() compara los objetos utilizando el operador ==, que se traduce en la llamada al método hashCode().
El método hashCode() devuelve un dato de tipo int que identifica al objeto. Dicho entero debería estar en función de valores que determinen cuando un objeto es igual o distinto de otro, en el caso de una finca largo y ancho.
Es más rápido que el método equals.
int []arr1 = new int[1];
int []arr2 = new int[1];
int []arr3 = arr1;
System.out.println(arr1 + " - " + arr1.hashCode()); // [I@27f674d - 41903949
System.out.println(arr2 + " - " + arr2.hashCode()); // [I@57829d67 - 1468177767
System.out.println(arr3 + " - " + arr3.hashCode()); // [I@27f674d - 41903949
System.out.println(arr1 == arr2); // false
System.out.println(arr1 == arr3); // true
Cuando comparamos dos objetos…
- Si tienen diferente hashcode, son diferentes.
- Si tienen el mismo hashcode, pueden ser diferentes y se llamará al método equals para determinarlo.
- Si son iguales según el método equals, deben tener el mismo hashcode.
- Si no son iguales según el método equals, pueden tener o no el mismo hashcode.
Hashcode en estructuras de tipo hash
Cuando Java compara dos objetos en estructuras de tipo hash (HashMap, HashSet etc) primero invoca al método hashcode para saber si los objetos van a estar en el mismo grupo. Se trata de una comparación “rapida” si devuelven el mismo hashCode quiere decir que pueden ser iguales.
HashSet<int[]> conjunto = new HashSet<>();
int[] arr1 = new int[1];
int[] arr2 = new int[1];
conjunto.add(arr1);
conjunto.add(arr2);
System.out.println(conjunto.contains(arr1));
System.out.println(conjunto.contains(new int[1]));
Sobreescritura del hashcode (JDK 7)
public int hashCode() {
return Objects.hash(x, y);
}
Sobreescritura del compareTo
El método compareTo determina si un objeto es mayor, menor o igual a otro. Devuelve 0 si son iguales, 1 (o un entero positivo cualquiera) si el primero es mayor q el segundo y -1 (o un número negativo cualquiera) si el segundo es mayor que el primero
Finca.java
public class Finca implements Comparable<Finca>{
...
public int compareTo(Finca otherFinca){
double areaThisFinca = this.getAncho()*this.getLargo();
double areaOtherFinca = otherFinca.getAncho()*otherFinca.getLargo();
int valorDevuelto = 0;
if(areaThisFinca > areaOtherFinca )return 1;
if(areaThisFinca < areaOtherFinca )return -1;
if(areaThisFinca == areaOtherFinca )return 0;
}
Main.java
Collections.sort(lista); //Para que esto funcione es necesario implementar la interfaz comparable
Iterator<Finca> it = lista.iterator();
while(it.hasNext()){
Finca c = it.next();
System.out.println(c.getNombre());
}
Notas
- Todos los objetos tienen el método equals(), pero no todos tienen el método compareTo().
- Si sobreescribo el compareTo, debería sobreescribir el equals. Si sobreescribo el equals, debo sobreescribir el hashcode.
Ejercicio – equals y compareTo
Vamos a completar el ejercicio anterior añadiendo a la clase Deposito la sobreescritura del método compareTo.