Гаразд, дозвольте мені пояснити поняття дуже простими словами.
По-перше, з більш широкої точки зору ми маємо колекції, а хешмап - одна з структур даних у колекціях.
Щоб зрозуміти, чому нам потрібно перекрити і метод рівних, і хеш-код, якщо потрібно спочатку зрозуміти, що таке хешмап і що це робить.
Хешмап - це структура даних, яка зберігає ключові пари значень даних у масиві. Скажімо, [], де кожен елемент у "a" - пара ключових значень.
Також кожен індекс у вищевказаному масиві може бути пов'язаний списком, тим самим маючи більше одного значення в одному індексі.
Тепер для чого використовується хешмап? Якщо нам доведеться шукати серед великого масиву, то пошук по кожному з них, якщо вони не будуть ефективними, тож те, що хеш-техніка говорить нам, що дозволяє попередньо обробити масив за допомогою якоїсь логіки та згрупувати елементи, засновані на цій логіці, тобто хешинг
наприклад: у нас є масив 1,2,3,4,5,6,7,8,9,10,11 і ми застосовуємо хеш-функцію mod 10, так що 1,11 буде згруповано разом. Отже, якщо нам довелося шукати 11 в попередньому масиві, тоді нам доведеться повторити повний масив, але коли ми групуємо його, ми обмежуємо нашу область ітерації, тим самим покращуючи швидкість. Таку структуру даних, яка використовується для зберігання всієї вищезгаданої інформації, для простоти можна розглядати як 2d масив
Тепер крім вищевказаного хешмапу також вказано, що він не повинен додавати в нього жодних копій. І це головна причина, чому нам доводиться перекривати рівності та хеш-код
Отже, коли сказано, що пояснюють внутрішню роботу хешмапу, нам потрібно знайти, які методи має хешмап і як він дотримується вищевказаних правил, які я пояснив вище
тому хешмап має метод, який називається put (K, V), і відповідно до хешмапу він повинен дотримуватися наведених вище правил ефективного розподілу масиву і не додавати жодних дублікатів
тож, що робиться, це те, що він спочатку генерує хеш-код для даного ключа, щоб вирішити, в якому індексі значення повинно входити. Якщо в цьому індексі нічого немає, то нове значення буде додане там, якщо щось там вже є то нове значення слід додати після закінчення зв'язаного списку в цьому індексі. але пам’ятайте, що жодних дублікатів не слід додавати відповідно до бажаної поведінки хешмапу. тому скажемо, що у вас є два цілі об'єкти aa = 11, bb = 11. як і кожен об'єкт, похідний з класу об'єктів, типовою реалізацією для порівняння двох об'єктів є те, що він порівнює посилання, а не значення всередині об'єкта. Отже, у вищенаведеному випадку обидва, хоча і семантично рівні, не зможуть перевірити рівність, і можливість існування двох об'єктів, які мають однаковий хеш-код і однакові значення, створює копії. Якщо ми перекриємо, ми могли б уникнути додавання дублікатів. Ви також можете звернутися до цьогоДеталі працюють
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());
}
}