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

对象相等判断时,覆写equals方法时同时覆写hashcode方法

 
阅读更多

错误案例

【现象描述】 里面判断容器应该要包含的对象,实际上却没有

【错误代码】

class T {
  private String str;

  T(String str) {
    this.str = str;
  }

  public boolean equals(Object obj) {
    if(!(obj instanceof T)){
      return false;
    }
    T t = (T)obj;
    return t.equals(this.str);
  }

  //这里没有覆写hashCode方法

  public static void main(String[] args) {
    Set set = new HashSet();
    set.add(new T("str"));
    System.out.println(set.contains(new T("str")));//false
  }
}

错误分析

HashMap和HashSet获取value是通过传入的object的hashcode在内存中找地址,如果存在对应的value,就把地址对应的value返回。

contains是通过传入的object的hashcode在内存中找地址,将传入的object和对应地址上的value通过equals方法比较,如果相等就返回true,否则false。

如果new一个object作为key去拿value是永远得不到结果的,因为每次new一个object,这个object的hashcode是永远不同的,所以我们要重写hashcode。

所以,在这个例子中在覆写equals这个方法的同时,还要覆写hashCode方法。

正确用法

class T {
  private String str;

  T(String str) {
    this.str = str;
  }

  public boolean equals(Object obj) {
    if(!(obj instanceof T)){
      return false;
    }
    T t = (T)obj;
    return t.equals(this.str);
  }
 
//同时要覆写hashCode方法
  public int hashCode() {
    int hash = 0;
    if(str!=null){
      for(char c: str.toCharArray()){
        hash +=c;
      }
    }
    return hash;    
  }
}

分享到:
评论

相关推荐

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object...同时,我们还需要注意到,重写equals方法时,必须重写hashCode方法,以便于确保对象的正确性和一致性。

    高级开发人员面试宝典之各种面试题以及点评.docx

    * 覆写 hashcode 方法,需要把某个非零常数值,例如 17,保存在 int 变量 result 中。 * 对于对象中每一个关键域 f(指 equals 方法中考虑的每一个域): + 对于 boolean 型,计算(f? 0 : 1)。 + 对于 byte,char,...

    提高代码质量的方法.

    - 覆写equals方法时要处理null值,同时覆写hashcode以保持一致性。 - 推荐覆写toString方法,提供更友好的输出。 - 使用package-info.java为包提供元数据。 4. **字符串操作**: - 使用字符串直接量赋值,提高...

    Java开发军规.docx

    当覆写对象的equals()方法时必须同时覆写hashCode()方法。equals和hashCode方法是对象在hash容器内高效工作的基础,正确的覆写这两个方法才能保证在hash容器内查找对象的正确性。 遵循这些军规可以确保Java开发的...

    Java2全方位讲议(内部讲议)9

    2. **覆写 hashCode 方法**:为了确保相等的对象有相同的哈希码,你需要在重写 `equals` 方法的同时,也重写 `hashCode` 方法。可以参考包装类(Wrapper Classes)中的实现。 **对象的复制** 1. **Object 类的 ...

    Java 编程军规.docx

    #### 军规八:覆写equals()方法时同时覆写hashCode() - **解释**:当一个对象的equals()方法被覆写后,如果没有同时覆写hashCode()方法,可能会导致该对象在哈希表中的行为不符合预期。 - **实践建议**:确保equals...

    Effective Java第三版1

    2. **覆写hashCode**:确保相等的对象有相同的哈希码,不相等的对象有不同哈希码,以保证集合类的行为正确。 3. **始终覆写toString**:提供对象状态的简洁表示,有助于调试和日志记录。 4. **小心覆写clone**:`...

    java学习笔记(二)

    覆写`equals`方法是为了比较两个对象是否相等,通常在重写`equals`时,也需要考虑覆写`hashCode`方法以保持一致性。 总的来说,本篇笔记涵盖了Java面向对象编程的基础知识,包括类和对象的定义、方法的创建、对象的...

    华为java编程军规

    军规八:覆写对象的 equals() 方法时必须同时覆写 hashCode() 方法。这是因为当对象被添加到集合中时,需要使用 hashCode() 方法来判断对象的唯一性。 军规九:禁止循环中创建新线程,尽量使用线程池。这是因为循环...

    java集合详解

    Collection接口提供了一系列通用方法,如contains()(判断是否包含指定元素)、clear()(清空容器)、equals()(比较两个集合是否相等)和iterator()(获取迭代器)。 1.2.2 迭代器 迭代器是遍历集合中元素的主要...

    [计算机软件及应用]Java开发规范.doc

    当重写`equals`方法时,务必同时重写`hashCode`方法,以保持对象一致性,这对于集合框架尤其重要。 **2.2.6 懒加载对象** 懒加载对象时,不推荐使用双检查锁定(Double-Checked Locking)模式,因为这可能在多线程...

    Java源码分析:集合-容器.pdf

    为了保证元素的唯一性,存储在HashSet中的对象必须正确地覆写hashCode和equals方法。TreeSet利用二叉树的原理对元素进行排序,它可以将元素按照指定的顺序进行排序。如果需要对自定义对象进行排序,则要求该对象必须...

    通过Lombok来简化你的代码1

    Lombok是一款java库,主要用来简化java代码的编写,通过使用注解,可以减少大量的getter、setter、equals、hashCode、toString等方法的编写,从而提高开发效率。 安装Lombok 要使用Lombok,需要先安装Lombok插件。...

    Java八股文Java八股文

    Java八股文主要涵盖Java语言的基础知识,包括对象方法、数据类型、序列化、字符串处理、方法重载与重写、反射、动态代理以及集合框架等核心概念。下面将逐一详细解析这些知识点。 1. **Object类相关方法** - `...

    2018java面试宝典

    - **equals** 方法用于比较两个对象的内容是否相等。默认情况下,equals 方法的行为类似于 "==",但可以被覆写以实现更复杂的比较逻辑。 - **示例代码**: ```java Integer a = new Integer(10); Integer b = new ...

    程序员32问程序员32问

    如果想要自定义元素的相等性,可以在覆盖equals()方法的同时,也覆盖hashCode()方法以保持一致性。 以上是对标题和描述中提到的知识点的详细说明。这些知识点涵盖了Java编程语言的基础概念和技术细节,对于初学者和...

    java集合相关学习.pdf

    为了优化Map的性能,对象在作为键使用时,通常需要覆写hashCode()和equals()方法,确保当两个键被视为相等时,它们的哈希码也相同。 总结,Java集合框架为开发者提供了灵活的数据组织方式,无论是在简单的数据管理...

    java集合详解.pdf

    为了保证Map的正确工作,键对象必须实现equals()和hashCode()方法,使得相等的键返回相同的哈希码,这样在Map中查找时能正确找到对应的键值对。 总结来说,Java集合框架提供了丰富的数据结构和算法,帮助开发者高效...

Global site tag (gtag.js) - Google Analytics