Programa Java para comparar dos objetos

Un objeto es una instancia de una clase que tiene su estado y comportamiento. En Java, al estar orientado a objetos, el recolector de basura siempre lo crea dinámicamente y lo destruye automáticamente cuando el alcance del objeto finaliza.

Ilustración: Un ejemplo para ilustrar un objeto de una clase:

Muebles silla=nuevo Muebles();

Muebles sofá = muebles nuevos();

// Aquí, la silla y el sofá son dos objetos de la clase Mobiliario

Enfoques: 

Hay dos métodos estándar:

  1. Usando iguales()
    • sin anular
    • Con anulación
  2. Usando el método hashCode() y equals()

Ejemplo 1: aunque el método equals() se puede usar para comparar los valores de dos strings, no es realmente útil por defecto para comparar dos objetos sin anularlo.

Java

//  Java Program to compare two objects
 
// Importing java input output library
import java.io.*;
 
// Class 1
class Pet {
    // attributes of class1
    String name;
    int age;
    String breed;
 
    // constructor of class 1
    Pet(String name, int age, String breed)
    {
        // Assignment of current attributes
        /// using this keyword with same
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
}
 
/* Class 2 : where execution is shown
             for class 1 */
public class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Objects of class1 (auxiliary class)
        // are assigned value */
        Pet dog1 = new Pet("Snow", 3, "German Shepherd");
        Pet cat = new Pet("Jack", 2, "Tabby");
        Pet dog2 = new Pet("Snow", 3, "German Shepherd");
 
        // Checking objects are equal and
        // printing output- true/false
        System.out.println(dog1.equals(dog2));
    }
}
Producción

false

Ejemplo 2: anular el método equals()

Aunque los valores de dog1 y dog2 son los mismos, el método equals() siempre comprueba la referencia de los dos objetos, es decir, si ambos objetos pasados ​​se refieren al mismo objeto o no y no a sus valores. Por lo tanto, es recomendable no utilizar este método para comparar objetos sin anularlo. Implementando el método equals para el ejemplo anterior:

Java

// Java Program to Compare Two Objects
 
import java.io.*;
 
class Pet {
    String name;
    int age;
    String breed;
 
    Pet(String name, int age, String breed)
    {
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
    @Override public boolean equals(Object obj)
    {
 
        // checking if the two objects
        // pointing to same object
        if (this == obj)
            return true;
 
        // checking for two condition:
        // 1) object is pointing to null
        // 2) if the objects belong to
        // same class or not
        if (obj == null
            || this.getClass() != obj.getClass())
            return false;
 
        Pet p1 = (Pet)obj; // type casting object to the
                           // intended class type
 
        // checking if the two
        // objects share all the same values
        return this.name.equals(p1.name)
            && this.age == p1.age
            && this.breed.equals(p1.breed);
    }
}
 
public class GFG {
    public static void main(String args[])
    {
 
        Pet dog1 = new Pet("Snow", 3, "German Shepherd");
        Pet cat = new Pet("Jack", 2, "Tabby");
        Pet dog2 = new Pet("Snow", 3, "German Shepherd");
        System.out.println(dog1.equals(dog2));
    }
}
Producción

true

Ejemplo 3: En el ejemplo anterior, el método equals() verifica si todos los valores coinciden o no. Sin embargo, se puede anular de cualquier manera posible, es decir, si uno o dos valores coinciden, etc. Por ejemplo, si queremos verificar dos valores cualesquiera para hacer que el método equals() considere que los dos objetos son iguales:

Java

// Java Program to Compare Two Objects
 
// Importing java input/output libraries
import java.io.*;
 
// Class 1
class Pet {
    // Attributes of objects
    String name;
    int age;
    String breed;
 
    // Constructor
    Pet(String name, int age, String breed)
    {
        // Assigning current there it self
        // using this keyword
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
 
    @Override public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null
            || this.getClass() != obj.getClass())
            return false;
        Pet p1 = (Pet)obj;
 
        // Checking only if attribute- name
        // and age is same and ignoring breed
        return this.name.equals(p1.name)
            && this.age == p1.age;
    }
}
 
public class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Assigning values to attributes of object
        // of class 1
        Pet dog1 = new Pet("Snow", 3, "German Shepherd");
        Pet cat1 = new Pet("Jack", 2, "Tabby");
        Pet dog2 = new Pet("Snow", 3, "German Shepherd");
        Pet cat2 = new Pet("Jack", 2, "Persian");
 
        // Checking if object are equal and
        // printing boolean output
        System.out.println(cat1.equals(cat2));
    }
}
Producción

true

Usando hashCode() y equals()

Este método es más como un complemento del anterior. Verificar los valores hash usando hashCode() antes de ingresar equals() reduce drásticamente el tiempo necesario para producir la solución. De esta forma, muchas comparaciones entre dos objetos no necesitan pasar por la comparación de todos los valores dentro de ellos.

Ejemplo 1: la implementación anterior junto con el uso de hashCode() :

Java

// Java Program to Compare Two Objects
 
// Importing java input/output libraries
import java.io.*;
 
// Class 1
class Pet {
    // Attributes of objects of class
    String name;
    int age;
    String breed;
 
    // Constructor
    Pet(String name, int age, String breed)
    {
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
 
    // Overriding using hashCode() method
    @Override public int hashCode()
    {
        /* overriding hashCode() method
        to check the length of the names */
        return this.name.length() % 10;
    }
 
    // Boolean function to check
    @Override public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null
            || this.getClass() != obj.getClass())
            return false;
        Pet p1 = (Pet)obj;
 
        return this.name.equals(p1.name)
            && this.age == p1.age && this.breed == p1.breed;
    }
}
// main class (class2)
public class GFG {
 
    // Main driver method
    public static void main(String args[])
    {
 
        // Assigning values to object of class 1(Pet class)
        Pet dog1 = new Pet("Snow", 3, "German Shepherd");
        Pet cat1 = new Pet("Jack", 2, "Tabby");
        Pet dog2 = new Pet("Snow", 3, "German Shepherd");
        Pet cat2 = new Pet("Jack", 2, "Persian");
 
        /* hashCode() generates true as the lengths of
           the name value of the two objects are same*/
 
        // Condition check using hashCode() method
        if (dog1.hashCode() == cat1.hashCode())
 
            /* On entering equals() method, it checks for
               other values and hence, returns false */
            System.out.println(dog1.equals(cat1));
        else
            System.out.println("Not equal");
    }
}
Producción

false

Ejemplo 2: 

Java

// Java Program to Compare Two Objects
 
import java.io.*;
 
class Pet {
    String name;
    int age;
    String breed;
 
    Pet(String name, int age, String breed)
    {
        this.name = name;
        this.age = age;
        this.breed = breed;
    }
    @Override public int hashCode()
    {
        // overriding hashCode() method to first
        // check the length of the names*/
        return this.name.length() % 10;
    }
    @Override public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null
            || this.getClass() != obj.getClass())
            return false;
        Pet p1 = (Pet)obj;
 
        return this.name.equals(p1.name)
            && this.age == p1.age && this.breed == p1.breed;
    }
}
 
public class GFG {
    public static void main(String args[])
    {
 
        Pet dog1 = new Pet("Snow", 3, "German Shepherd");
        Pet cat1 = new Pet("Jack", 2, "Tabby");
        Pet dog2 = new Pet("Snow", 3, "German Shepherd");
        Pet cat2 = new Pet("Jack", 2, "Persian");
        Pet dog3 = new Pet("Ray", 1, "Siberian Husky");
 
        // here, hashCode() generates false and condition
        // reverts to the else statement as soon as it finds out
        // the lengths of the name value of the objects are
        // differenT
        if (dog1.hashCode() == dog3.hashCode())
            System.out.println(dog1.equals(dog3));
        else
            System.out.println("Not equal");
    }
}
Producción

Not equal

Publicación traducida automáticamente

Artículo escrito por dikshapatro 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 *