2016-08-09 4 views
0

У меня есть некоторая путаница в отношении хеш-кода, я пытаюсь понять, как хэш-карта использует хеш-код и метод 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] 

ответ

0

Вы перекрываться hashcode() в вашем Employee классе надлежащим образом - (это не функция идеально хеширование (вы можете больше узнать о хэшировании, например, Effective Java)).

Когда вы используете HashMap, хеширование используется для значений на карте. Именно по этой причине ваш отладчик вводит метод hashcode().

Если это использование моей реализации хеш-кода, оно должно обрабатывать ключи, которые должны быть дублирующими (что в случае использования employee.getEmpid()), и не должно хранить ключи.

Это не true. Если два объекта имеют один и тот же хэш-код, они просто попадают в тот же ведро, что на самом деле означает, что они хранятся в списке один за другим. HashSet обеспечивает функцию, аналогичную описанной вами, - она ​​не позволяет дублировать. Если вы попытаетесь поместить два равных объекта в HashSet, будет сохранен только один.

hashcode() и equals()очень важно аспекты программирования на Java. Я рекомендую вам прочитать упомянутую выше книгу или по крайней мере this article.

+0

Не могли бы вы объяснить, что такое hapineing, если я даю ключу e1.getEmpid(), ....., e4.getEmpid() вместо 1,2,3,4? Я понимаю, что в более позднем случае (когда ключ 1,2,3,4) объекты попадают в один и тот же ковш, поэтому вы имеете в виду, что e3 находится в том же ковше, что и e1, а e2 и e4 находятся в одном ведре. Но как я могу их повторить? –

Смежные вопросы