Anulando el método de igualdad en Java

Considere el siguiente programa Java: 

Java

class Complex {
    private double re, im;   
     
    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
}
 
// Driver class to test the Complex class
public class Main {
    public static void main(String[] args) {
        Complex c1 = new Complex(10, 15);
        Complex c2 = new Complex(10, 15);
        if (c1 == c2) {
            System.out.println("Equal ");
        } else {
            System.out.println("Not Equal ");
        }
    }
}

Producción: 

Not Equal 

La razón para imprimir «No es igual» es simple: cuando comparamos c1 y c2, se verifica si tanto c1 como c2 se refieren al mismo objeto o no ( las variables de objeto siempre son referencias en Java ). c1 y c2 se refieren a dos objetos diferentes, por lo que el valor (c1 == c2) es falso. Si creamos otra referencia, digamos c3 como la siguiente, entonces (c1 == c3) dará verdadero.

Java

Complex c3 = c1;  // (c3 == c1) will be true

Entonces, ¿cómo verificamos la igualdad de valores dentro de los objetos? Todas las clases en Java heredan de la clase Object, directa o indirectamente (Ver punto 1 de este ). La clase Object tiene algunos métodos básicos como clone(), toString(), equals(), etc. Podemos anular el método equals en nuestra clase para verificar si dos objetos tienen los mismos datos o no. 

Java

class Complex {
 
    private double re, im;
 
    public Complex(double re, double im) {
        this.re = re;
        this.im = im;
    }
 
    // Overriding equals() to compare two Complex objects
    @Override
    public boolean equals(Object o) {
 
        // If the object is compared with itself then return true 
        if (o == this) {
            return true;
        }
 
        /* Check if o is an instance of Complex or not
          "null instanceof [type]" also returns false */
        if (!(o instanceof Complex)) {
            return false;
        }
         
        // typecast o to Complex so that we can compare data members
        Complex c = (Complex) o;
         
        // Compare the data members and return accordingly
        return Double.compare(re, c.re) == 0
                && Double.compare(im, c.im) == 0;
    }
}
 
// Driver class to test the Complex class
public class Main {
 
    public static void main(String[] args) {
        Complex c1 = new Complex(10, 15);
        Complex c2 = new Complex(10, 15);
        if (c1.equals(c2)) {
            System.out.println("Equal ");
        } else {
            System.out.println("Not Equal ");
        }
    }
}

Producción: 

Equal 

Como nota al margen, cuando anulamos equals(), se recomienda también anular el método hashCode(). Si no lo hacemos, los objetos iguales pueden obtener diferentes valores hash; y las colecciones basadas en hash, incluidas HashMap, HashSet y Hashtable, no funcionan correctamente (consulte esto para obtener más detalles). Cubriremos más sobre hashCode() en una publicación separada. 
Referencias: 
Segunda edición efectiva de Java
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *