/ / Ejemplo de 2 objetos en java que tienen el mismo valor hash pero el método igual devuelve falso en ellos: java, anulación, igual, código hash

Ejemplo de 2 objetos en java que tienen el mismo valor de hash pero el método igual devuelve falso en ellos: java, anulación, igual, código hash

Todos sabemos que si equals método devuelve true, entonces dos objetos son iguales.

¿Alguien puede dar un ejemplo donde 2 objetos tienen el mismo? hash Valor pero en realidad son diferentes?

Respuestas

1 para la respuesta № 1

Supongo que usted está familiarizado con el (los) contrato (s) asociado (s) con la anulación equals() y hashCode(), y las implicaciones de un propenso a colisionesImplementación de hashCode. Dado que, el siguiente ejemplo trivial utiliza un objeto que contiene dos enteros e implementa un código hash muy simple, y demuestra lo fácil que es tener dos objetos que no son iguales pero tienen el mismo código hash. Proporcionar un algoritmo hashCode más sofisticado puede aliviar esta.

La salida de main en ejecución es:

hashCodes: ih1: 6, ih2: 6
equals: false

Código de ejemplo:

package example.stackoverflow;

public class IntHolder
{
private Integer primaryData;
private Integer secondaryData;

public IntHolder(Integer primaryData, Integer secondaryData)
{
this.primaryData = primaryData;
this.secondaryData = secondaryData;
}

@Override
public int hashCode()
{
return ((primaryData == null) ? 0 : primaryData.hashCode()) +
((secondaryData == null) ? 0 : secondaryData.hashCode());
}

@Override
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
IntHolder other = (IntHolder) obj;
if (primaryData == null)
{
if (other.primaryData != null)
return false;
}
else if (!primaryData.equals(other.primaryData))
return false;
if (secondaryData == null)
{
if (other.secondaryData != null)
return false;
}
else if (!secondaryData.equals(other.secondaryData))
return false;
return true;
}

public static void main(String[] args)
{
IntHolder ih1 = new IntHolder(1, 5);
IntHolder ih2 = new IntHolder(3, 3);

System.out.println("hashCodes: ih1: " + ih1.hashCode() + ", ih2: " + ih2.hashCode());
System.out.println("equals: " + ih1.equals(ih2));
}
}

Para referencia, el código de hash generado automáticamente por Eclipse para la clase IntHolder es:

@Override
public int hashCode()
{
final int prime = 31;
int result = 1;
result = prime * result
+ ((primaryData == null) ? 0 : primaryData.hashCode());
result = prime * result
+ ((secondaryData == null) ? 0 : secondaryData.hashCode());
return result;
}

1 para la respuesta № 2
String str1="abcdef";
String str2="abcdfG";

Ambos tienen el mismo código hash y el método igual devuelve falso.


0 para la respuesta № 3
public class Employee {

protected long   employeeId;

public boolean equals(Object o){
if(o == null)                return false;
if(!(o instanceof) Employee) return false;

Employee other = (Employee) o;
return this.employeeId == other.employeeId;

}

public int hashCode(){
return (int) this.employeeId;

}

}

En este ejemplo, hemos anulado el método de igualdad: dos empleados son iguales cuando tendrán la misma identificación de empleado.

Si dos objetos de Employee son iguales, también tendrán el mismo código hash.

Su respuesta

En este ejemplo, también implementamos el hash.código: hashcode es el ID de empleado que se redondea a un int. Eso significa que muchos identificadores de empleados podrían resultar en el mismo código hash, pero estos objetos de Empleados aún no serían iguales, ya que no tienen el mismo identificador de empleados.