Ok, pozwól mi wyjaśnić pojęcie w bardzo prostych słowach.
Po pierwsze, z szerszej perspektywy, mamy kolekcje, a hashapa jest jedną z struktur danych w kolekcjach.
Aby zrozumieć, dlaczego musimy zastąpić zarówno metodę equals, jak i hashcode, w razie potrzeby najpierw zrozumiemy, co jest hashap i co robi.
Hashap jest strukturą danych, która przechowuje pary kluczowych wartości danych w sposób tablicowy. Powiedzmy, że [], gdzie każdy element w „a” jest parą klucz-wartość.
Również każdy indeks w powyższej tablicy może być połączoną listą, dzięki czemu ma więcej niż jedną wartość w jednym indeksie.
Dlaczego teraz używana jest mapa? Jeśli musimy przeszukiwać dużą tablicę, to przeszukujemy każdą z nich, jeśli nie będą one wydajne, więc jaka technika haszowania mówi nam, że pozwala wstępnie przetworzyć tablicę z pewną logiką i pogrupować elementy w oparciu o tę logikę, tj. Mieszanie
np .: mamy tablicę 1,2,3,4,5,6,7,8,9,10,11 i stosujemy mod funkcji skrótu 10, więc 1,11 zostanie zgrupowane razem. Więc jeśli musielibyśmy szukać 11 w poprzedniej tablicy, musielibyśmy iterować całą tablicę, ale kiedy ją pogrupujemy, ograniczamy nasz zakres iteracji, zwiększając w ten sposób szybkość. Ta struktura danych używana do przechowywania wszystkich powyższych informacji może być traktowana jako tablica 2D dla uproszczenia
Teraz oprócz powyższego hashapa mówi również, że nie doda w nim żadnych duplikatów. I to jest główny powód, dla którego musimy zastąpić equals i hashcode
Więc kiedy powiedziano, że wyjaśnia wewnętrzne działanie haszapa, musimy znaleźć metody, które ma haszapa i jak postępuje zgodnie z powyższymi zasadami, które wyjaśniłem powyżej
więc w haszapie jest metoda o nazwie as (K, V) i zgodnie z haszapem powinna ona spełniać powyższe zasady efektywnego rozmieszczania tablicy i nie dodawania żadnych duplikatów
więc to, co robi, polega na tym, że najpierw wygeneruje kod skrótu dla danego klucza, aby zdecydować, w którym indeksie powinna wejść wartość. jeśli nic nie ma w tym indeksie, wówczas nowa wartość zostanie tam dodana, jeśli coś już tam jest następnie nową wartość należy dodać po zakończeniu listy połączonej pod tym indeksem. ale pamiętaj, że nie należy dodawać duplikatów zgodnie z pożądanym zachowaniem mapy skrótów. powiedzmy, że masz dwa obiekty całkowite aa = 11, bb = 11. jak każdy obiekt wyprowadzony z klasy obiektu, domyślną implementacją do porównywania dwóch obiektów jest porównanie referencji, a nie wartości wewnątrz obiektu. Tak więc w powyższym przypadku oba, choć semantycznie równe, nie przejdą testu równości, i istnieje możliwość, że dwa obiekty o tym samym haszu i takich samych wartościach będą istnieć, tworząc w ten sposób duplikaty. Jeśli zastąpimy, moglibyśmy uniknąć dodawania duplikatów. Możesz również odnieść się doSzczegóły pracy
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());
}
}