java的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-06 20:04:24

java的Object类中hashCode()和equals()方法-----转载的相关文章

java.long.object类中的重要方法

一:概念 java.long.object Object类是所有Java类的祖先.每个类都使用 Object 作为超类. 二:方法概览 clone() 创建并返回此对象的一个副本. equals(Object obj) 指示某个其他对象是否与此对象“相等”. finalize() 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法.(JVM中自带的垃圾回收机制只能回收new出的对象) getClass() 返回一个对象的运行时类. hashCode() 返回该对象的哈希码值

Java 中 hashCode 和 equals 方法 小结

转载:http://www.oschina.net/question/82993_75533 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. hashcode主要是set集合使用,是用于判断对象是否”可能“相等的快捷办法,以解决大集合的问题.举例来说,如果一个一万个元素的集合加入一个元素,如果是一个新元素,那么必须要equal一万次才能加入.所以采用hashcode,hashcode的思路是如果equal,则ha

Java关于Object类中equal方法的理解

话不多说,先上例题 1 package Ch_11; 2 3 public class Test { 4 public static void main(String[] args) { 5 Object circle1 = new Circle(); 6 Object circle2 = new Circle(); 7 System.out.println(circle1.equals(circle2)); 8 } 9 } 10 11 class Circle { 12 double radi

并发编程(六)Object类中线程相关的方法详解

一.notify() 作用:唤醒一个正在等待该线程的锁的线程 PS : 唤醒的线程不会立即执行,它会与其他线程一起,争夺资源 /** * Object类的notify()和notifyAll()方法详解 */ public class MyNotify { // 在多线程间共享的对象上使用wait private String[] shareObj = {"true"}; public static void main(String[] args) { MyNotify test =

Object类中的toString(),equals(), hashCode()方法之间的关系

1.在没有重写之前: 1) toString()方法返回的是对象的:Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例).at 标记符"@"和此对象哈希码的无符号十六进制表示组成.换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())  比如:[email protected] 2) equals():对于任何非空引用值 x 和 y

Object 类中的 equals方法

1 相等与同一 如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等.如果两个引用对象指的是同一个对像,则称这两个变量同一.Object类中定义的equals 函数原型为:public boolean equals(Object);他是判断两个对象是否同一,并不是是否相等. 2 equals方法 由于Object 类是所有类的最高基类,所有其他类都继承类Object类的equals()方法,定义原型如下: public boolean equals (Object x){ return

写出java.lang.Object类的六个常用方法

java是面向对象的语言,而Object类是java中所有类的顶级父类(根类). 每个类都使用Object类作为超类,所有对象(包括数组)都实现这个类的方法,即使一个类没有用extends明确指出继承于某个类,那么它都默认继承Object类. Object类中提供了很多方法,这里只取其中比较常用的方法做下简述. 1)public String toString()  >>> 获取对象信息的方法 这个方法在打印对象时被调用,将对象的信息变为字符串返回,默认输出对象地址. 举个例子: /**

问题1、java.lang中String类和Object类中的equals方法比较

String类中的equals方法重写了Object类中的equals方法,下面通过代码来比较二者的不同之处: 一.String类 1. String s1 = "String"; String s2 = "String"; System.out.println(s1 == s2 ); System.out.println(s1.equals(s2));

JAVA中Object类中的equals方法补充

Object类中的equals方法: 无论new多少个对象,当使用 "= =" 来判断的时候,是判断内存地址.判断回事false 若是需要进行对象之间的判断,则需要重写equals方法: public boolean equals(Object obj)//obj是传入的形式参数(对象) { if (obj == null)//判断对象是否为空 { return false;//空则返回false } else { if ( obj instanceof cat)//判断这个传入参数(