Java牛角尖【010】: 当对象a.equals(b)时,a.hashCode == b.hashCode吗?

当然不是了,hashCode和equals方法都可以被重写的,如果重写了其中的一个,而没有重写另外一个, 这个结论明显是错误的。 
  代码如下: 

Java代码 
  1. 1.  public class Test {    
  2. 2.      public static void main(String[] args) {    
  3. 3.          // TODO Auto-generated method stub    
  4. 4.          Test2 t = new Test2("zhangsan"20);    
  5. 5.          Test2 t2 = new Test2("zhangsan"30);    
  6. 6.      
  7. 7.          System.out.println(t.equals(t2));    
  8. 8.          System.out.println(t.hashCode() == t2.hashCode());    
  9. 9.      }    
  10. 10. }    
  11. 11.     
  12. 12class Test2 {    
  13. 13.     public Test2(String name, int age) {    
  14. 14.         super();    
  15. 15.         this.name = name;    
  16. 16.         this.age = age;    
  17. 17.     }    
  18. 18.     
  19. 19.     @Override    
  20. 20.     public boolean equals(Object obj) {    
  21. 21.         if (this == obj)    
  22. 22.             return true;    
  23. 23.         if (obj == null)    
  24. 24.             return false;    
  25. 25.         if (getClass() != obj.getClass())    
  26. 26.             return false;    
  27. 27.         Test2 other = (Test2) obj;    
  28. 28.         if (name == null) {    
  29. 29.             if (other.name != null)    
  30. 30.                 return false;    
  31. 31.         } else if (!name.equals(other.name))    
  32. 32.             return false;    
  33. 33.         return true;    
  34. 34.     }    
  35. 35.     
  36. 36.     String name = "";    
  37. 37.     int age;    
  38. 38.     
  39. 39. }    

  运行结果如下: 
Java代码 
  1. 1.  true    
  2. 2.  false    

  当然,我们在重写equals方法时最好将hashCode方法也重写了,代码如下: 
Java代码 
  1. 1.  public class Test {    
  2. 2.      public static void main(String[] args) {    
  3. 3.          // TODO Auto-generated method stub    
  4. 4.          Test2 t = new Test2("zhangsan"20);    
  5. 5.          Test2 t2 = new Test2("zhangsan"30);    
  6. 6.      
  7. 7.          System.out.println(t.equals(t2));    
  8. 8.          System.out.println(t.hashCode() == t2.hashCode());    
  9. 9.      }    
  10. 10. }    
  11. 11.     
  12. 12class Test2 {    
  13. 13.     public Test2(String name, int age) {    
  14. 14.         super();    
  15. 15.         this.name = name;    
  16. 16.         this.age = age;    
  17. 17.     }    
  18. 18.     
  19. 19.     @Override    
  20. 20.     public int hashCode() {    
  21. 21.         final int prime = 31;    
  22. 22.         int result = 1;    
  23. 23.         result = prime * result + ((name == null) ? 0 : name.hashCode());    
  24. 24.         return result;    
  25. 25.     }    
  26. 26.     
  27. 27.     @Override    
  28. 28.     public boolean equals(Object obj) {    
  29. 29.         if (this == obj)    
  30. 30.             return true;    
  31. 31.         if (obj == null)    
  32. 32.             return false;    
  33. 33.         if (getClass() != obj.getClass())    
  34. 34.             return false;    
  35. 35.         Test2 other = (Test2) obj;    
  36. 36.         if (name == null) {    
  37. 37.             if (other.name != null)    
  38. 38.                 return false;    
  39. 39.         } else if (!name.equals(other.name))    
  40. 40.             return false;    
  41. 41.         return true;    
  42. 42.     }    
  43. 43.     
  44. 44.     String name = "";    
  45. 45.     int age;    
  46. 46.     
  47. 47. }    

  这样的话,题目的答案当然是对的。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值