`
liuxinglanyue
  • 浏览: 562748 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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. }    

  这样的话,题目的答案当然是对的。 

分享到:
评论

相关推荐

    解析Java对象的equals()和hashCode()的使用

    深入解析Java对象的equals()和hashCode()的使用 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个。在多数情况下,这两个函数是不用考虑的,直接使用它们...

    Java理论与实践:hashCode()和equals()方法

    本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...

    Java_重写equals()和hashCode()

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是对象的基本组成部分,它们在很多场景下都发挥着至关重要的作用。这两个方法与对象的相等性比较和哈希表(如HashMap、HashSet)的运作紧密相关。这篇博客将深入...

    java中hashcode()和equals()的详解

    在Java编程语言中,`hashCode()`和`equals()`方法是对象身份验证的关键组成部分,它们主要用于对象的比较和哈希表(如HashMap、HashSet等)的操作。理解这两个方法的工作原理对于编写高效和可靠的代码至关重要。 ...

    springfox-core-3.0.1-SNAPSHOT.jar

    解决 ERROR s.d.s.web.plugins.DocumentationPluginsBootstrapper:98 - Unable to scan documentation context default ... at springfox.documentation.schema.Example.equals(Example.java:131)

    java中hashcode()和equals()方法详解

    在这个例子中,`equals()`方法基于`name`和`age`属性来判断两个`Person`对象是否相等,而`hashCode()`方法也考虑到了这两个属性,以确保当两个对象相等时,它们的哈希码也相同。 #### 总结 `hashCode()`和`equals()...

    2.javaequals()方法.zip

    2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2.javaequals()方法.zip2....

    Java中equals,hashcode和==的区别

    "Java中equals、hashcode和==的区别" Java 中 equals、hashcode 和==的区别是 Java 编程语言中一个经常遇到的问题。这三个概念都是用来比较对象的,但是它们之间存在着本质的区别。 首先,==号是Java中的一个...

    快捷键记事本

    - **Ctrl+Shift+H**: 创建当前类的hashcode和equals方法。 - **Ctrl+Shift+P**: 创建构造函数。 - **Ctrl+Q**: 定位到最近编辑的位置。 - **Ctrl+Shift+U**: 转换当前文件的编码格式。 - **Ctrl+H**: 打开替换对话框...

    hashcode和equals的分析

    当向`Set`集合添加元素时,首先会调用元素的`hashCode`方法。根据返回的哈希码值,Java能够快速定位元素应该存放的位置。如果该位置没有元素,则直接存储;如果有元素,则进一步通过`equals`方法来判断元素是否真正...

    java 基础之(equals hashcode)

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 和 `HashSet`)时。`equals()` 方法用于判断两个对象是否相等,而 `hashCode()` 方法则用于...

    hashcode()和equals()

    在Java编程语言中,`hashCode()` 和 `equals()` 方法是两个非常重要的概念,尤其是在处理对象比较和哈希表(如 `HashMap` 或 `HashSet`)时。这两个方法来源于 `Object` 类,是所有Java类的基类,因此,每个自定义类...

    java中hashcode()和equals()的详解.docx

    当向集合中添加一个对象时,集合会首先调用该对象的`hashCode()`方法来获取其哈希码,然后根据哈希码计算出该对象应存储的位置。如果该位置为空,则直接存放;若位置已有其他对象,则继续调用`equals()`方法判断是否...

    Java中Object.equals和String.equals的区别详解

    在上面的示例代码中,我们可以看到,a和b都是常量,它们都是指向常量存储区中的常量"hello",所以无论内容还是内存地址都是一样的,因此a==b以及a.equals(b)都是true;c和d都是变量,他们都是new出来的对象,里面存在...

    Java equals 方法与hashcode 方法的深入解析.rar

    在Java编程语言中,`equals()`方法和`hashCode()`方法是两个非常重要的概念,它们主要用于对象的比较和哈希表的高效运作。本解析将深入探讨这两个方法的用途、实现原理以及它们之间的关联。 首先,`equals()`方法是...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    重写 `hashCode()` 方法时,我们需要确保当两个对象满足 `equals()` 的条件时,它们的哈希码也相同。同时,为了提高性能,我们应该尽量让不同的对象产生不同的哈希码。例如,对于上述Person类,可以这样重写 `...

    equals与hashCode在实际开发中的重写写法

    在Java编程语言中,`equals()` 和 `hashCode()` 方法是两个非常重要的成员,尤其是在处理对象比较和集合操作时。这两个方法通常与`Object`类中的默认实现相关联,但为了在实际开发中实现正确的对象比较和哈希表操作...

    计算机后端-Java-Java核心基础-第14章 面向对象06 17. equals()练习2:代码实现.avi

    计算机后端-Java-Java核心基础-第14章 面向对象06 17. equals()练习2:代码实现.avi

    计算机后端-Java-Java核心基础-第14章 面向对象06 16. equals()练习1:代码实现.avi

    计算机后端-Java-Java核心基础-第14章 面向对象06 16. equals()练习1:代码实现.avi

Global site tag (gtag.js) - Google Analytics