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,它将无法正常工作。 问题答案: 您可以将其强制转换为方法,只需使用的实例确保其类型正确
我正在尝试创建一个有理数类并覆盖等于和哈希代码方法。但是我的等号在明显不正确的情况下又回来了,即分子和分母不同。知道是什么原因造成的吗?