/ / Exemple de 2 objets en java ayant la même valeur de hachage mais la méthode equals renvoie false - java, override, equals, hashcode

Exemple de 2 objets en java ayant la même valeur de hachage mais la méthode equals renvoie false - java, override, est égal à, hashcode

Nous savons tous que si equals retours de méthode true, alors deux objets sont égaux.

Quelqu'un peut-il donner un exemple où 2 objets ont le même hash valeur mais ils sont réellement différents?

Réponses:

1 pour la réponse № 1

Je suppose que vous connaissez le (s) contrat (s) associé (s) à la décision equals() et hashCode(), et les implications d'un risque de collisionImplémentation de hashCode. Étant donné cela, l’exemple trivial suivant utilise un objet qui contient deux entiers et implémente un hashCode très simple, et démontre à quel point il est facile d’avoir deux objets qui ne sont pas égaux mais qui ont le même hashCode. Fournir un algorithme plus sophistiqué ce.

La sortie de main courante est:

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

Exemple de code:

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));
}
}

HashCode () généré automatiquement par Eclipse pour la classe IntHolder est:

@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 pour la réponse № 2
String str1="abcdef";
String str2="abcdfG";

Ils ont tous les deux le même hashcode et la méthode equals renvoie false.


0 pour la réponse № 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;

}

}

Dans cet exemple, nous avons remplacé la méthode equals - deux employés sont égaux quand ils auront le même identifiant

Si deux objets Employé sont égaux, ils auront également le même code de hachage.

Votre Ans -

Dans cet exemple, nous avons également implémenté le hashcode - hashcode est employeeId qui est arrondi à un int. Cela signifie que beaucoup d’identifiants d’employé pourraient donner le même code de hachage, mais que ces objets Employé ne seraient toujours pas égaux, puisqu’ils n’auraient pas le même id d’employé.