У меня есть некоторая путаница в отношении хеш-кода, я пытаюсь понять, как хэш-карта использует хеш-код и метод equals, и я написал код ниже, проблема даже в том, что я даю ключу Integer Object, его использование реализации хеш-кода моего переопределенного метода хэш-кода в объекте employee (который я храню как значение).HasMap Hash code implemetation
Согласно моему пониманию, поскольку ключ является Целочисленным, он должен использовать метод хеш-кода класса Object, а не реализацию хеш-кода.
Если это использование моей реализации хеш-кода, оно должно обрабатывать ключи, которые должны быть дублированы (что он делает, если я использую employee.getEmpid()) и не должен хранить ключи.
Я отлаживал его, и поток всегда переходит к моей реализации метода хэш-кода в нижеприведенном классе сотрудников.
Сотрудник Тест
public class EmployeeTest {
private static final Map<Integer, Employee> hmap = new HashMap<>();
public static void main(String[] args) {
Employee e1 = new Employee(1, "Satya", "IT");
Employee e2 = new Employee(2, "Deep", "HR");
Employee e3 = new Employee(1, "Rajeev", "OPERATIONS");
Employee e4 = new Employee(2, "Lovely", "FINANCE");
hmap.put(1, e1);
hmap.put(2, e2);
hmap.put(3, e3);
hmap.put(4, e4);
System.out.println(hmap.put(1, e1).hashCode());
System.out.println(hmap.put(2, e2).hashCode());
System.out.println(hmap.put(3, e3).hashCode());
System.out.println(hmap.put(4, e4).hashCode());
System.out.println(e1.equals(e3));
System.out.println(hmap.put(1, e1).equals(hmap.put(3, e3)));
Set<Entry<Integer, Employee>> hset = hmap.entrySet();
//Set<String> hashset = hmap.keySet();
hset.stream().collect(Collectors.toSet()).forEach(e -> System.out.println(e));
}
}
Сотрудник
public class Employee {
private String empname, empdept;
private int empid;
public Employee(int empid, String empname, String empdept) {
this.empid = empid;
this.empname = empname;
this.empdept = empdept;
}
public int hashCode(){
return this.empid;
}
public boolean equals(Employee e){
return this.empid == e.empid;
}
public int getEmpid() {
return empid;
}
public void setEmpid(int empid) {
this.empid = empid;
}
public String getEmpname() {
return empname;
}
public void setEmpname(String empname) {
this.empname = empname;
}
public String getEmpdept() {
return empdept;
}
public void setEmpdept(String empdept) {
this.empdept = empdept;
}
}
Выход
1
2
1
2
true
true
[email protected]
[email protected]
[email protected]
[email protected]
Не могли бы вы объяснить, что такое hapineing, если я даю ключу e1.getEmpid(), ....., e4.getEmpid() вместо 1,2,3,4? Я понимаю, что в более позднем случае (когда ключ 1,2,3,4) объекты попадают в один и тот же ковш, поэтому вы имеете в виду, что e3 находится в том же ковше, что и e1, а e2 и e4 находятся в одном ведре. Но как я могу их повторить? –