Ok, lassen Sie mich das Konzept in sehr einfachen Worten erklären.
Erstens haben wir aus einer breiteren Perspektive Sammlungen, und Hashmap ist eine der Datenstrukturen in den Sammlungen.
Um zu verstehen, warum wir die Methode equals und hashcode überschreiben müssen, müssen wir zuerst verstehen, was Hashmap ist und was funktioniert.
Eine Hashmap ist eine Datenstruktur, in der Schlüsselwert-Datenpaare auf Array-Weise gespeichert werden. Sagen wir a [], wobei jedes Element in 'a' ein Schlüsselwertpaar ist.
Außerdem kann jeder Index in dem obigen Array eine verknüpfte Liste sein, wodurch mehr als ein Wert an einem Index vorliegt.
Warum wird nun eine Hashmap verwendet? Wenn wir in einem großen Array suchen müssen, dann durchsuchen Sie jedes Array, wenn es nicht effizient ist. Welche Hash-Technik sagt uns also, dass wir das Array mit einer gewissen Logik vorverarbeiten und die Elemente basierend auf dieser Logik gruppieren können, dh Hashing
Beispiel: Wir haben das Array 1,2,3,4,5,6,7,8,9,10,11 und wenden eine Hash-Funktion mod 10 an, sodass 1,11 zusammen gruppiert werden. Wenn wir also im vorherigen Array nach 11 suchen müssten, müssten wir das gesamte Array iterieren, aber wenn wir es gruppieren, begrenzen wir unseren Iterationsumfang, wodurch die Geschwindigkeit verbessert wird. Diese Datenstruktur, die zum Speichern aller oben genannten Informationen verwendet wird, kann der Einfachheit halber als 2D-Array betrachtet werden
Abgesehen von der obigen Hashmap wird nun auch angegeben, dass keine Duplikate hinzugefügt werden. Und dies ist der Hauptgrund, warum wir die Gleichheits- und Hashcodes überschreiben müssen
Wenn also gesagt wird, dass dies die interne Funktionsweise von Hashmap erklärt, müssen wir herausfinden, welche Methoden die Hashmap hat und wie sie den oben beschriebenen Regeln folgt
Daher hat die Hashmap eine Methode, die als put (K, V) bezeichnet wird, und gemäß der Hashmap sollte sie den obigen Regeln folgen, um das Array effizient zu verteilen und keine Duplikate hinzuzufügen
Put generiert also zuerst den Hashcode für den angegebenen Schlüssel, um zu entscheiden, in welchen Index der Wert eingegeben werden soll. Wenn an diesem Index nichts vorhanden ist, wird der neue Wert dort hinzugefügt, wenn dort bereits etwas vorhanden ist Dann sollte der neue Wert nach dem Ende der verknüpften Liste an diesem Index hinzugefügt werden. Denken Sie jedoch daran, dass gemäß dem gewünschten Verhalten der Hashmap keine Duplikate hinzugefügt werden sollten. Nehmen wir also an, Sie haben zwei Integer-Objekte aa = 11, bb = 11. Wie bei jedem von der Objektklasse abgeleiteten Objekt besteht die Standardimplementierung für den Vergleich zweier Objekte darin, dass die Referenz und nicht die Werte innerhalb des Objekts verglichen werden. Im obigen Fall bestehen beide, obwohl semantisch gleich, den Gleichheitstest nicht und es besteht die Möglichkeit, dass zwei Objekte mit demselben Hashcode und denselben Werten vorhanden sind, wodurch Duplikate erstellt werden. Wenn wir überschreiben, können wir das Hinzufügen von Duplikaten vermeiden. Sie könnten sich auch darauf beziehenDetailarbeiten
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());
}
}