2016-12-27 148 views
-6

需要對散列碼和hashcode中的equals方法提出一些問題和解釋。下面是問題:何時覆蓋hashcode和equals方法在java中

  1. 什麼時候在put或get期間調用hashcode和equals會被調用?
  2. 當我們存儲自定義對象時,我在每個教程中發現我們需要重寫hashcode。但如果我不重寫,那麼它會產生相同的結果。除了當我使用新的運營商。下面是示例程序:

我將員工對象存儲到散列映射中,然後我沒有重寫散列碼和等於方法,那麼代碼按預期工作。

Employee e1= new Employee("ram", 1000); 
     Employee e2= new Employee("sai", 1001); 
     Employee e3= new Employee("krishna", 1002); 


     System.out.println("e1.hashCode() : "+e1.hashCode()); 
     System.out.println("e2.hashCode() : "+e2.hashCode()); 
     System.out.println("e3.hashCode() : "+e3.hashCode()); 


     Map<Employee, String> map= new HashMap<Employee, String>(); 

     map.put(e1, "employee1"); 
     map.put(e2, "employee2"); 
     map.put(e3, "employee3");   


     for (Entry<Employee, String> entry : map.entrySet()) 
     { 
      System.out.println(entry.getKey().getName() +"-"+entry.getKey().getid() + "-" + entry.getValue()); 
     } 

     System.out.println(map.get(e3));   
     System.out.println(map.get(new Employee("krishna", 1002))); 
  • 當你重寫equals,需要被照顧什麼東西。
  • 當您重寫散列碼時,需要注意哪些事項。
  • 當您只覆蓋等於,那麼默認哈希碼將如何表現。
  • 當你只重寫哈希碼,那麼該如何默認平等的行爲。*
  • +2

    夥計,這就像你甚至沒有嘗試。這些問題在谷歌第一頁的任何結果中回答爲「java equals hashCode」。 –

    +0

    嘗試再次添加相同的員工,但作爲新的實例:'員工e4 =新員工(「克里希納」,1002);'然後它會停止工作,因爲你期望。 – RadekJ

    +0

    除了作爲(其他許多人)的副本之外,你的問題太廣泛了,而且在問你問題之前,你顯然還沒有充分研究過這個問題(例如用Google搜索答案)。 –

    回答

    0

    閱讀本Article了詳細的解釋。

    總之,即使你沒有在你的類中實現hashCode和equals,也有一個從Object類繼承的默認實現。這就是爲什麼你沒有看到任何問題。

    但是使用Collections時肯定會遇到問題。

    -1

    Hashcode和equals需要最小化衝突。您的目標是以這種方式實現散列碼,以便存儲桶中只有一個條目。 Equals將幫助您區分哈希碼相同的兩個條目。散列碼和等於一起決定兩個密鑰是否相同。所以如果這些都沒有照顧,兩個不同的自定義對象可能被視爲相同的關鍵,​​第二個將替換地圖中的第一個。

    相關問題