關於hashCode()和equal()方法的問題

在Set或者Map存數據的時候:咱們先經過 hashcode來判斷兩個對象是否在一個鏈表上,但這個鏈表上可能有不少元素之,那麼咱們就須要再經過 equals 來判斷時候存在相同的值,以便進行對該數據進行存儲或者覆蓋。【因此當咱們重寫equal()方法,就必須先重寫hashCode()方法】this

實例:.net

  1. public class HashTest {  
  2.     private int i;  
  3.   
  4.     public int getI() {  
  5.         return i;  
  6.     }  
  7.   
  8.     public void setI(int i) {  
  9.         this.i = i;  
  10.     }  
  11.   
  12.     public int hashCode() {  
  13.         return i % 10;  
  14.     }  
  15.   
  16.     public final static void main(String[] args) {  
  17.         HashTest a = new HashTest();  
  18.         HashTest b = new HashTest();  
  19.         a.setI(1);  
  20.         b.setI(1);  
  21.         Set<HashTest> set = new HashSet<HashTest>();  
  22.         set.add(a);  
  23.         set.add(b);  
  24.         System.out.println(a.hashCode() == b.hashCode());  
  25.         System.out.println(a.equals(b));  
  26.         System.out.println(set);  
  27.     }  
  28. }  


這個輸出的結果:code

  1. true  
  2. false  
  3. [com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]  


以上這個示例,咱們只是重寫了hashCode方法,從上面的結果能夠看出,雖然兩個對象的hashCode相等,可是實際上兩個對象並非相等;,咱們沒有重寫equals方法,那麼就會調用object默認的equals方法,【是比較兩個對象的引用是否是相同,顯示這是兩個不一樣的對象,兩個對象的引用確定是不定的】。這裏咱們將生成的對象放到了HashSet中,而HashSet中只可以存放惟一的對象,也就是相同的(適用於equals方法)的對象只會存放一個,可是這裏其實是兩個對象a,b都被放到了HashSet中,這樣HashSet就失去了他自己的意義了。對象

 

此時咱們把equals方法給加上:get

  1. public class HashTest {  
  2.     private int i;  
  3.   
  4.     public int getI() {  
  5.         return i;  
  6.     }  
  7.   
  8.     public void setI(int i) {  
  9.         this.i = i;  
  10.     }  
  11.   
  12.     public boolean equals(Object object) {  
  13.         if (object == null) {  
  14.             return false;  
  15.         }  
  16.         if (object == this) {  
  17.             return true;  
  18.         }  
  19.         if (!(object instanceof HashTest)) {  
  20.             return false;  
  21.         }  
  22.         HashTest other = (HashTest) object;  
  23.         if (other.getI() == this.getI()) {  
  24.             return true;  
  25.         }  
  26.         return false;  
  27.     }
  28.   
  29.     public int hashCode() {  
  30.         return i % 10;  
  31.     }  
  32.   
  33.     public final static void main(String[] args) {  
  34.         HashTest a = new HashTest();  
  35.         HashTest b = new HashTest();  
  36.         a.setI(1);  
  37.         b.setI(1);  
  38.         Set<HashTest> set = new HashSet<HashTest>();  
  39.         set.add(a);  
  40.         set.add(b);  
  41.         System.out.println(a.hashCode() == b.hashCode());  
  42.         System.out.println(a.equals(b));  
  43.         System.out.println(set);  
  44.     }  
  45. }  

此時獲得的結果就會以下:hash

  1. true  
  2. true  
  3. [com.ubs.sae.test.HashTest@1]  
相關文章
相關標籤/搜索