object的hashCode与equals

JAVA代码:
    public static void main(String[] args)
    {
        Object obj1 = new Object();
        Object obj2= new Object();
        Object obj3 = obj2;
        System.out.println("obj1==obj2 ?"+obj1.equals(obj2));
        System.out.println("obj2==obj3 ?"+obj2.equals(obj3));
        
        System.out.println("obj1‘s hashcode: "+obj1.hashCode());
        System.out.println("obj1‘s hashcode: "+obj2.hashCode());
        System.out.println("obj1‘s hashcode:
"+obj3.hashCode()); 
    }
}

输出结果:
obj1==obj2 ?false
obj2==obj3 ?true
obj1‘s hashcode: 12677476
obj1‘s hashcode: 33263331
obj1‘s hashcode: 33263331

总结
API Object类中源代码:
 public boolean equals(Object obj) {
    return (this == obj);
    }
     也就是当我们写了一个自己的class,然后用class new了两个对象,如果在这两个对象上用equals时,此时比较的两个引用是不是一样,也就是他们的物理地址是不是一样,如果不一样的话,就会返回false.
    我们实际用的时候,往往不是希望比较两个对象的物理地址是不是一样,而比较两个对象的属性等东西是不是一样,所以Object提供的方法往往不能满足我们要求。
    这就需要我们覆盖Object的equals方法。

如果要覆盖Object的equals的方法,一定要满足以下几个等价关系:
1. 自反性,对于任何非null的引用值x,x.equals(x)必须反回true
2. 对称性,对于任何非null的引用值x,y,当且仅当y.equals(x)返回true时,x.equals(y),才返回true.
3. 传递性,对于任何非null的引用值x,y,z,如果x.equals(y)返回true,并且y.equals(z)返回ture,那
    么x.equals(z)也必须返回true.
4. 一致性,对于任何非null的引用值x,y,只要equals比较操作的两个对象中所用的信息没有被修改,多次
    调用x.equals(y)就会一致的返回true,或者一致的返回false.
5.对于任何的非null的值x,x.equals(null),必须返回false .

如果我们的程序中没有完全遵守这些约定,那么你的程式就有可能发生问题。

没有出问题的原因是,因为你的程序没有地方 直接调用 或者 间接调用 equals方法。
什么是直接调用equals ,什么是间接调用equals呢?
直接调用equals方法就是说,你显式的在你的程序中对你自己的写的对象上面调用equals方法,
间接调用呢,用一简单的例子来说,当我们平常会把一个些对象放到collection,为了不重复,我们有调用collection的contains方法,此时就间接调用了collection中对象的equals方法。

覆盖了equals的类中,也必须覆盖hashCode方法

简单的结论:当对象类没有不符合规范的override equals()和hashcode()方法的时候,两个对象做比较

  1. 如果equals()比较相同,那么hashcode()肯定相同。
  2. 如果hashcode()比较相同,那么equals()不一定相同。

众所周之,String 、Math、还有Integer、Double。。。。等这些封装类重写了Object中的equals()方法,让它不再比较句柄(引用),而是比较对象中实际包含的整数的值,即比较的是内容。

而Object的equals()方法比较的是地址值。
一般来说,如果你要把一个类的对象放入容器中,那么通常要为其重写equals()方法,让他们比较地址值而不是内容值。特别地,如果要把你的类的对象放入散列中,那么还要重写hashCode()方法;要放到有序容器中,还要重写compareTo()方法。

为什么要重写hashCode方法? 
我们应该先了解java判断两个对象是否相等的规则。 在java的集合中,判断两个对象是否相等的规则是:

首先,判断两个对象的hashCode是否相等 
如果不相等,认为两个对象也不相等 
如果相等,则判断两个对象用equals运算是否相等 
如果不相等,认为两个对象也不相等 
如果相等,认为两个对象相等

我们在equals方法中需要向下转型,效率很低,所以先判断hashCode方法可以提高效率。

equals()相等的两个对象,hashcode()一定相等; 
equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。 
反 过来:hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。

时间: 2024-08-18 20:12:58

object的hashCode与equals的相关文章

Object对象详解(三)之hashCode与equals

从学习Java开始,就从各个师兄.各种书籍.各大网站听到.看到,重写equals方法必须重写hashCode方法.重写equals方法必须重写hashCode方法.重写equals方法必须重写hashCode方法. 那么为什么呢?今天就详细剖析一下equals和hashCode! equals方法是比较两个对象实例是否相等.Object中equals方法的描述为: public boolean equals(Object obj) { return (this == obj); } 也就是默认情

hashcode和equals

在java中,万物皆对象,所有的对象都继承于Object类,Object类有两个方法equals和hashCode.equals一般用来比较两个对象的内容是否相等,而hashCode一般用来提高容器的查询效率. public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } equals在没有重写的情况下和==是一样的,对于值类型,比较的是值,对于引用类型则比较的是对象的首地址.

hashCode与equals

很多东西都是大处显积累,小处见功力,来点功力. hashCode跟equals 相伴相生,所以要一起讨论才有意义. 在java中,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,就是说当集合中插入对象时,怎么分辨该对象是否已经存在.按照正常思路,应该是依次进行equals比较,但是其实效率不高,java中的做法是先比较hashCode,如果相同在equals比较,到这里,疑问就出来了,为什么会比较hashCode,hashCode相同的情况下为什么equals为什么还会不同?

重写hashCode与equals方法的作用

为了阐明其作用,我们先来假设有如下一个Person类. class Person { public Person(String name, int age) { this.name = name; this.age = age; } private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; }

关于hashCode与equals

首先我得说明,在我们自己写得类中你可以复写这两个方法,此时从语法的角度来说,他们没关系. 在object中 public native int hashCode(); public boolean equals(Object obj) { return (this == obj); } 两个准则 在java集合中 判定两个对象是否相等需要以下两步; 1 hashCode的值是否相等, 如果不相等,那么不用说,两个对象肯定不相等;如果hashCode的值相等,那么看第二步; 2 equals的值是

java 小结3 hashcode和equals I/o问题

我需要把星期天看的一些东西记录下来,要不然会忘记. hashCode.equals: 1)每个java对象都有hashCode和equals方法. java的终极类是object类,那么object类是如何来标注自己呢,就是object这个类是如何来区分对方.就是使用它们的hashcode和equals来推断. (hashcode是通过hash算法实现的) 2)JVM每new一个object,都会讲Object丢到一个Hash(哈希表)里去,这样下次比较或者获取这个对象的时候就可以根据对象的ha

Java基础:hashCode与equals个人学习记录

摘要: 本文主要记录本人对hashCode和对equals两个知识点的学习过程. 从学生时期初学java,就知道hashCode和equals这两个方法,工作中equals方法使用也是特别频繁,要说equals方法,那么必须少不了hashCode这个方法.下面就整理一下本人目前对这俩方法的理解,文中如有错误,请指正,多谢. hash code(散列码,也可以叫哈希码值)是对象产生的一个整型值.其生成没有规律的.二者散列码可以获取对象中的信息,转成那个对象的"相对唯一"的整型值.所有对象

hashcode和equals方法

分析: 1:Person类 1:姓名和年龄 2:重写hashCode和equals方法 1:如果不重写,调用Object类的equals方法,判断内存地址,为false 1:如果是Person类对象,并且姓名和年龄相同就返回true 2:如果不重写,调用父类hashCode方法 1:如果equals方法相同,那么hashCode也要相同,需要重写hashCode方法 3:重写toString方法 1:不重写,直接调用Object类的toString方法,打印该对象的内存地址 Person类 cl

Java hashCode() 和 equals()的若干问题

原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equals() 之间有什么联系? 第1部分 equals() 的作用 equals() 的作用是 用来判断两个对象是否相等. equals() 定义在JDK的Object.java中.通过判断两个对