当前位置: 首页 > 编程笔记 >

java中重写equals()方法的同时要重写hashcode()方法(详解)

易阳朔
2023-03-14
本文向大家介绍java中重写equals()方法的同时要重写hashcode()方法(详解),包括了java中重写equals()方法的同时要重写hashcode()方法(详解)的使用技巧和注意事项,需要的朋友参考一下

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定html" target="_blank">声明相等对象必须具有相等的哈希码。如下:

(1) 当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true

(2) 当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false

如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象

(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址 hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。

这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆,因此,就也需要重写hashcode()

举例说明:

import java.util.*;

public class HelloWorld {
  public static void main(String[] args) {
    /*
    Collection c = new HashSet();
    c.add("hello");
    c.add(new Name("f1","l1"));
    c.add(new Integer(100));
    c.remove("hello"); 
    c.remove(new Integer(100));
    System.out.println(c.remove(new Name("f1","l1")));
    */
    Name n1 = new Name("01");
    Name n2 = new Name("01");
    
    Collection c = new HashSet();
    c.add(n1);
    System.out.println("------------");
    c.add(n2);
    System.out.println("------------");
    System.out.println(n1.equals(n2));
    System.out.println("------------");
    System.out.println(n1.hashCode());
    System.out.println(n2.hashCode());
    System.out.println(c);
  }


}

class Name {
  private String id;
  public Name(String id) {
    this.id = id; 
  }
  
  public String toString(){
    return this.id;
  }
  public boolean equals(Object obj) {
    if (obj instanceof Name) {
      Name name = (Name) obj;
      System.out.println("equal"+ name.id);
      return (id.equals(name.id));
    }
    return super.equals(obj);
  }
    
  public int hashCode() {
    Name name = (Name) this;
    System.out.println("Hash" + name.id);
    return id.hashCode();
      
  }
}

就这个程序进行分析,在第一次添加时,调用了hashcode()方法,将hashcode存入对象中,第二次也一样,然后对hashcode进行比较。hashcode也只用于HashSet/HashMap/Hashtable类存储数据,所以会用于比较,需要重写

总结,自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较

以上这篇java中重写equals()方法的同时要重写hashcode()方法(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍java中为何重写equals时必须重写hashCode方法详解,包括了java中为何重写equals时必须重写hashCode方法详解的使用技巧和注意事项,需要的朋友参考一下 前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白。 在上一篇博文Java中e

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha

  • 本文向大家介绍为什么在重写 equals方法的同时必须重写 hashcode方法,包括了为什么在重写 equals方法的同时必须重写 hashcode方法的使用技巧和注意事项,需要的朋友参考一下 我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类。 其 equals 方法比较的是两个对象的引用指向的地址,hashcode 是一个本地方法,返回的是对象地址值。O

  • 本文向大家介绍重写hashCode()和equals()方法详细介绍,包括了重写hashCode()和equals()方法详细介绍的使用技巧和注意事项,需要的朋友参考一下 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equals()方法 如果你决定要重写

  • 问题内容: 如何覆盖对象类中的equals方法? 即我有 我想将参数obj转换为Person类型,但是如果执行(Person)obj,它将无法正常工作。 问题答案: 您可以将其强制转换为方法,只需使用的实例确保其类型正确

  • 我正在尝试创建一个有理数类并覆盖等于和哈希代码方法。但是我的等号在明显不正确的情况下又回来了,即分子和分母不同。知道是什么原因造成的吗?