Ok, permettez-moi d'expliquer le concept en termes très simples.
Premièrement, dans une perspective plus large, nous avons des collections, et hashmap est l'une des infrastructures de données dans les collections.
Pour comprendre pourquoi nous devons remplacer les deux méthodes égal et hashcode, si besoin de comprendre d'abord ce qu'est hashmap et ce qui fait.
Une table de hachage est une structure de données qui stocke des paires clé-valeur de données à la manière d'un tableau. Disons a [], où chaque élément de 'a' est une paire de valeurs clés.
De plus, chaque index du tableau ci-dessus peut être une liste liée ayant ainsi plus d'une valeur à un index.
Maintenant, pourquoi une table de hachage est-elle utilisée? Si nous devons rechercher parmi un grand tableau, puis en les recherchant si elles ne seront pas efficaces, alors quelle technique de hachage nous dit qui permet de pré-traiter le tableau avec une logique et de regrouper les éléments en fonction de cette logique, c'est-à-dire le hachage
par exemple: nous avons le tableau 1,2,3,4,5,6,7,8,9,10,11 et nous appliquons une fonction de hachage mod 10 pour que 1,11 soit regroupé. Donc, si nous devions rechercher 11 dans le tableau précédent, nous devrions itérer le tableau complet, mais lorsque nous le groupons, nous limitons notre portée d'itération, améliorant ainsi la vitesse. Cette structure de données utilisée pour stocker toutes les informations ci-dessus peut être considérée comme un tableau 2D pour plus de simplicité
Maintenant, en dehors de la table de hachage ci-dessus, elle indique également qu'elle n'ajoutera aucun doublon. Et c'est la principale raison pour laquelle nous devons remplacer les égaux et le hashcode
Donc, quand on dit que cela explique le fonctionnement interne de hashmap, nous devons trouver quelles méthodes le hashmap a et comment suit-il les règles ci-dessus que j'ai expliquées ci-dessus
donc le hashmap a la méthode appelée as put (K, V), et selon hashmap il devrait suivre les règles ci-dessus pour distribuer efficacement le tableau et ne pas ajouter de doublons
donc ce qu'il fait, c'est qu'il va d'abord générer le code de hachage pour la clé donnée pour décider dans quel index la valeur doit entrer. si rien n'est présent à cet index, la nouvelle valeur sera ajoutée là-bas, si quelque chose est déjà là-bas alors la nouvelle valeur doit être ajoutée après la fin de la liste chaînée à cet index. mais n'oubliez pas qu'aucun doublon ne doit être ajouté selon le comportement souhaité de la table de hachage. disons donc que vous avez deux objets entiers aa = 11, bb = 11. comme chaque objet dérivé de la classe d'objets, l'implémentation par défaut pour comparer deux objets est qu'il compare la référence et non les valeurs à l'intérieur de l'objet. Donc, dans le cas ci-dessus, les deux, bien que sémantiquement égaux, échoueront au test d'égalité, et la possibilité que deux objets ayant le même code de hachage et les mêmes valeurs existent, créant ainsi des doublons. Si nous remplaçons alors nous pourrions éviter d'ajouter des doublons. Vous pouvez également vous référer àTravail de détail
import java.util.HashMap;
public class Employee {
String name;
String mobile;
public Employee(String name,String mobile) {
this.name=name;
this.mobile=mobile;
}
@Override
public int hashCode() {
System.out.println("calling hascode method of Employee");
String str=this.name;
Integer sum=0;
for(int i=0;i<str.length();i++){
sum=sum+str.charAt(i);
}
return sum;
}
@Override
public boolean equals(Object obj) {
// TODO Auto-generated method stub
System.out.println("calling equals method of Employee");
Employee emp=(Employee)obj;
if(this.mobile.equalsIgnoreCase(emp.mobile)){
System.out.println("returning true");
return true;
}else{
System.out.println("returning false");
return false;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee emp=new Employee("abc", "hhh");
Employee emp2=new Employee("abc", "hhh");
HashMap<Employee, Employee> h=new HashMap<>();
//for (int i=0;i<5;i++){
h.put(emp, emp);
h.put(emp2, emp2);
//}
System.out.println("----------------");
System.out.println("size of hashmap: "+h.size());
}
}