Sobreescritura del equals

Curso de Java

11.  
22.  

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 (y su correspondiente) que devolverá true cuando dos depósitos tengan el mismo volumen (largo*ancho*alto).

Sobreescritura del hashcode

Este método sirve para comparar objetos dentro de una estructura de tipo Hash (HashMap, HashSet, etc.). Su reescritura no es indispensable, pero sí recomendable.

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. Cuando comparamos dos objetos…

  1. Si no tienen el mismo hashcode, son diferentes.
  2. Si tienen el mismo hashcode, se llamará al método equals.
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 productoThis = this.getAncho()*this.getLargo();
  double productoOther = otherFinca.getAncho()*otherFinca.getLargo();
  
  int valorDevuelto = 0;
  if(productoThis > productoOther)valorDevuelto=1;
  if(productoThis < productoOther)valorDevuelto=-1;
  if(productoThis == productoOther)valorDevuelto=0;
  return valorDevuelto; 
 }
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

  1. Hacer una clase llamada Deposito que tiene un nombre, un largo, un ancho y un alto.
  2. Dentro de la clase Depósito, definir un método equals (y su correspondiente método hashcode) que devolverá true cuando dos depósitos tengan el mismo volumen (largo*ancho*alto).
  3. Crear 5 depósitos.
  4. Añadirlos a una lista.
  5. Ordenar la lista.
  6. Recorrerla con un iterator.
  7. Comprobar que los depósitos están ordenados por su volumen. Para ello tendremos que haber sobreescrito el método compareTo

Por 9.99€ al mes tendrás acceso completo a todos los cursos. Sin matrícula ni permanencia.