métodos equals() y hashCode() en Java

Java.lang.object tiene dos métodos muy importantes definidos: public boolean equals(Object obj) y public int hashCode().

método igual()

En Java, el método equals() se usa para comparar la igualdad de dos objetos. La igualdad se puede comparar de dos maneras:

  • Comparación superficial: la implementación predeterminada del método equals se define en la clase Java.lang.Object, que simplemente verifica si dos referencias de objetos (por ejemplo, x e y) se refieren al mismo objeto. es decir, comprueba si x == y. Dado que la clase Object no tiene miembros de datos que definan su estado, también se conoce como comparación superficial.
  • Comparación profunda: suponga que una clase proporciona su propia implementación del método equals() para comparar los objetos de esa clase con el estado de los objetos. Eso significa que los miembros de datos (es decir, los campos) de los Objetos deben compararse entre sí. Tal comparación basada en miembros de datos se conoce como comparación profunda.

Sintaxis:

public boolean equals  (Object obj)

// This method checks if some other Object
// passed to it as an argument is equal to 
// the Object on which it is invoked.

Algunos principios del método equals() de la clase Object: si algún otro objeto es igual a un objeto dado, entonces sigue estas reglas:

  • Reflexivo: para cualquier valor de referencia a, a.equals(a) debería devolver verdadero.
  • Simétrico: para cualquier valor de referencia a y b, si a.equals(b) debe devolver verdadero, entonces b.equals(a) debe devolver verdadero.
  • Transitiva: para cualquier valor de referencia a, b y c, si a.equals(b) devuelve verdadero y b.equals(c) devuelve verdadero, entonces a.equals(c) debería devolver verdadero.
  • Coherente: para cualquier valor de referencia a y b, las invocaciones múltiples de a.equals(b) devuelven consistentemente verdadero o consistentemente devuelven falso, siempre que no se modifique la información utilizada en las comparaciones de igualdad en el objeto.
  • Nota: Para cualquier valor de referencia no nulo a, a.equals(null) debe devolver falso.

// Java program to illustrate 
// how hashCode() and equals() methods work
import java.io.*;
  
class Geek 
{
      
    public String name;
    public int id;
          
    Geek(String name, int id) 
    {
              
        this.name = name;
        this.id = id;
    }
      
    @Override
    public boolean equals(Object obj)
    {
          
    // checking if both the object references are 
    // referring to the same object.
    if(this == obj)
            return true;
          
        // it checks if the argument is of the 
        // type Geek by comparing the classes 
        // of the passed argument and this object.
        // if(!(obj instanceof Geek)) return false; ---> avoid.
        if(obj == null || obj.getClass()!= this.getClass())
            return false;
          
        // type casting of the argument. 
        Geek geek = (Geek) obj;
          
        // comparing the state of argument with 
        // the state of 'this' Object.
        return (geek.name == this.name && geek.id == this.id);
    }
      
    @Override
    public int hashCode()
    {
          
        // We are returning the Geek_id 
        // as a hashcode value.
        // we can also return some 
        // other calculated value or may
        // be memory address of the 
        // Object on which it is invoked. 
        // it depends on how you implement 
        // hashCode() method.
        return this.id;
    }
      
}
  
//Driver code
class GFG
{
      
    public static void main (String[] args)
    {
      
        // creating the Objects of Geek class.
        Geek g1 = new Geek("aa", 1);
        Geek g2 = new Geek("aa", 1);
          
        // comparing above created Objects.
        if(g1.hashCode() == g2.hashCode())
        {
  
            if(g1.equals(g2))
                System.out.println("Both Objects are equal. ");
            else
                System.out.println("Both Objects are not equal. ");
      
        }
        else
        System.out.println("Both Objects are not equal. "); 
    } 
}

Producción:

Both Objects are equal.

En el ejemplo anterior, vea la línea:

// if(!(obj instanceof Geek)) return false;--> avoid.-->(a)

Hemos usado esta línea en lugar de la línea anterior:

if(obj == null || obj.getClass()!= this.getClass()) return false; --->(y)

Aquí, primero estamos comparando el código hash en ambos objetos (es decir, g1 y g2) y si ambos objetos generan el mismo código hash, eso no significa que sean iguales, ya que el código hash también puede ser el mismo para diferentes objetos, si tienen el mismo identificación (en este caso). Entonces, si los valores del código hash generado son iguales para ambos Objetos, después de eso comparamos ambos Objetos con su estado para anular el método equals (Objeto) dentro de la clase. Y si ambos Objetos tienen el mismo estado de acuerdo con el método equals(Object), entonces son iguales, de lo contrario no lo son. Y sería mejor rendimiento wrt si diferentes objetos generan diferentes valores de código hash.

Motivo: el objeto de referencia también puede referirse al objeto de la subclase de Geek. La línea (b) asegura que devolverá falso si el argumento pasado es un Objeto de la subclase de la clase Geek. Pero la condición del operador instanceof no devuelve falso si encontró que el argumento pasado es una subclase de la clase Geek. Lea el operador InstanceOf .

método hashCode()

Devuelve el valor del código hash como un entero. El valor de Hashcode se usa principalmente en colecciones basadas en hash como HashMap, HashSet, HashTable… etc. Este método debe anularse en cada clase que anula el método equals().
Sintaxis:

public int hashCode()

// This method returns the hash code value 
// for the object on which this method is invoked.

El contrato general de hashCode es:

  • Durante la ejecución de la aplicación, si se invoca hashCode() más de una vez en el mismo objeto, debe devolver de forma constante el mismo valor entero, siempre que no se modifique la información utilizada en la comparación de iguales (objeto) en el objeto. No es necesario que este valor entero permanezca igual de una ejecución de la aplicación a otra ejecución de la misma aplicación.
  • Si dos Objetos son iguales, según el método equals(Object) , entonces el método hashCode() debe producir el mismo Integer en cada uno de los dos Objetos.
  • Si dos Objetos no son iguales, según el método equals(Object) , no es necesario que el valor Integer producido por el método hashCode() en cada uno de los dos Objetos sea distinto. Puede ser lo mismo, pero producir el entero distinto en cada uno de los dos objetos es mejor para mejorar el rendimiento de las colecciones basadas en hash como HashMap, HashTable, etc.

Nota: Los objetos iguales deben producir el mismo código hash siempre que sean iguales, sin embargo, los objetos desiguales no necesitan producir códigos hash distintos.

Enlace relacionado: Anulación de igual en Java
Referencia: JavaRanch

Este artículo es una contribución de Nitsdheerendra . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

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 *