Interesante pregunta de entrevista sobre hashCode y método equals

Requisito previo: métodos Equal y Hashcode en Java , por qué anular los métodos equal y hashcode

hashCode y el método equals se preguntan con frecuencia en las entrevistas de Java. En general, no anulamos ambos métodos, pero existen algunos escenarios/requisitos en los que tenemos que anular estos dos métodos. Uno de esos escenarios cuando almacenamos objetos definidos por el usuario en clases de colección que hacen uso del algoritmo hash. es decir, HashTable, HashSet y HashMap.

Pregunta de la entrevista: cree un mapa que contenga la dirección de cada empleado y use el objeto del empleado como clave. Guarde la dirección de algunos empleados en este mapa. Ahora cree un método que acepte el objeto Map y Employee como parámetros y devuelva la dirección de este empleado.

Enfoque 1 (sin anular los métodos hashCode y equals)

// Java program to create a map of employee
// and address Without overriding
// hashCode and equals methods
import java.util.HashMap;
import java.util.Map;
  
class Employee {
private int empId;
private String name;
  
    public Employee(int empId, String name)
    {
        this.empId = empId;
        this.name = name;
    }
  
}
  
class Address {
private int houseNo;
private String streetName;
private String city;
private int pinCode;
  
    public Address(int houseNo, String streetName, 
                         String city, int pinCode)
    {
        this.houseNo = houseNo;
        this.streetName = streetName;
        this.city = city;
        this.pinCode = pinCode;
    }
  
    public String getAddress()
    {
        return houseNo + ", " + streetName +
                   ", " + city + ", " + pinCode;
    }
}
  
public class Test {
    public static String getAddress(Map map, Employee emp)
    {
        Address adrs = (Address)map.get(emp);
        return adrs.getAddress();
    }
    public static void main(String[] args)
    {
  
        Employee emp1 = new Employee(110, "Sajid Ali Khan");
        Address adrs1 = new Address(304, "Marol Mahrisi", 
                                         "Mumbai", 400069);
  
        Employee emp2 = new Employee(111, "Jaspreet Singh");
        Address adrs2 = new Address(203, "Seepz", "Mumbai", 
                                                 400093);
  
        Map<Employee, Address> map = new HashMap<>();
        map.put(emp1, adrs1);
        map.put(emp2, adrs2);
  
        System.out.println(Test.getAddress(map, new Employee(110, 
                                              "Sajid Ali Khan")));
    }
}

Producción:

Exception in thread "main" java.lang.NullPointerException
    at Test.getAddress(Test.java:44)
    at Test.main(Test.java:59)

Esperábamos el resultado como la dirección del empleado, pero obtenemos NullPointerException y eso es bastante sencillo. nuevo empleado (110, «Sajid Ali Khan») en el mapa y nuevo empleado (110, «Sajid Ali Khan») en el argumento son dos instancias diferentes. Por lo tanto, obtenemos NullPointerException porque cuando hacemos map.get(emp), devuelve nulo.

Enfoque 2 (anulación de hashCode y método equals)

// Java program to create a map of employee
// and address using overriding
// hashCode and equals methods
import java.util.HashMap;
import java.util.Map;
  
class Employee {
private int empId;
private String name;
  
    public Employee(int empId, String name)
    {
        this.empId = empId;
        this.name = name;
    }
  
    @Override public int hashCode()
    {
        final int prime = 31;
        int result = 1;
        result = prime * result + empId;
        result = prime * result +
          ((name == null) ? 0 : name.hashCode());
        return result;
    }
  
    @Override public boolean equals(Object obj)
    {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Employee other = (Employee)obj;
        if (empId != other.empId)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }
}
  
class Address {
private int houseNo;
private String streetName;
private String city;
private int pinCode;
  
    public Address(int houseNo, String streetName, 
                        String city, int pinCode)
    {
        this.houseNo = houseNo;
        this.streetName = streetName;
        this.city = city;
        this.pinCode = pinCode;
    }
  
    public String getAddress()
    {
        return houseNo + ", " + streetName + ", " + 
                              city + ", " + pinCode;
    }
  
}
  
public class Test {
    public static String getAddress(Map map, Employee emp)
    {
        Address adrs = (Address)map.get(emp);
        return adrs.getAddress();
    }
    public static void main(String[] args)
    {
        Employee emp1 = new Employee(110, "Sajid Ali Khan");
        Address adrs1 = new Address(304, "Marol Mahrisi",
                                       "Mumbai", 400069);
  
        Employee emp2 = new Employee(111, "Jaspreet Singh");
        Address adrs2 = new Address(203, "Seepz", "Mumbai",
                                                  400093);
  
        Map<Employee, Address> map = new HashMap<>();
        map.put(emp1, adrs1);
        map.put(emp2, adrs2);
  
        System.out.println(Test.getAddress(map, new Employee(110, 
                                              "Sajid Ali Khan")));
    }
}

Producción:

304, Marol Mahrisi, Mumbai, 400069

Obtenemos el resultado esperado y eso se debe a que anulamos el método hashCode y equals correctamente en nuestro código. Cuando hacemos map.get(emp), internamente llama a nuestro método hashCode anulado que da como resultado el mismo código hash que el objeto empleado utilizado como clave en Map.

Una vez que se encuentra el depósito correcto, se llamará al método equals y coincidirá con todos los valores de ambos objetos Employee. Como resultado, obtenemos la dirección correcta del objeto Empleado.

Este artículo es una contribución de Sajid Ali Khan . 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 *