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