关于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]  
相关文章
相关标签/搜索