浅谈equals重写

Posted stupid-chan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈equals重写相关的知识,希望对你有一定的参考价值。

equals的简单了解:

Object中的equals方法用于检测一个对象是否等于另外一个对象. Object类中,判断两个对象是否引用同一个对象实现equals方法,源码如下:

 public boolean equals(Object obj) {
        return (this == obj);
    }

从源码可以看出,对于复合数据类型之间进行equals比较,在没有重写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较的结果跟双等号(==)的结果相同。

 

说回java中的比较:

1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean 
 他们之间的比较,应用双等号(==),比较的是他们的值。 
2.复合数据类型(类) 
 当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址。

 

说回equals重写:

不被重写(原生)的equals方法是严格判断一个对象是否相等的方法(object1 == object2),在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了,所以这个时候我们需要重写equals方法,来满足我们的业务系统上的需求,在重写equals的同时,也需要对hashCode进行重写。

 

看下关于Object.hashCode(摘自《Effective Java》第45页):

 

1、在一个应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同,即这个应用程序这次执行返回的整数与下一次执行返回的整数可以不一致。

2、如果两个对象根据equals(Object)方法是相等的,那么调用这两个对象中任一个对象的hashCode方法必须产生同样的整数结果。

3、如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表(hash table)的性能。

 

继续说equals重写:

如果只重写了equals方法而没有重写hashCode方法的话,则会违反约定的第二条:相等的对象必须具有相等的散列码(hashCode)。
同时对于HashSet和HashMap这些基于散列值(hash)实现的类。HashMap的底层处理机制是以数组的方法保存放入的数据的(Node<K,V>[] table),如果不重写hashCode的话,可能导致HashSet、HashMap不能正常的运作、如果我们将某个自定义对象存到HashMap或者HashSet及其类似实现类中的时候,如果该对象的属性参与了hashCode的计算,那么就不能修改该对象参数hashCode计算的属性了。有可能会移除不了元素,导致内存泄漏。
 

说说equals重写原则:

1.自反性:对于任何非空引用x,x.equals(x)应该返回true。
2.对称性:对于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也应该返回true。
3.传递性:对于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true。
4.一致性:如果x和y引用的对象没有发生变化,那么反复调用x.equals(y)应该返回同样的结果。
5.非空性:对于任意非空引用x,x.equals(null)应该返回false。

 

euqals重写格式:

 

@Override
  public boolean equals(Object obj) {
     if(this == obj)
         return true;
     if(obj == null)
         return false;
     if(!(obj instanceof EqualsDemo))
         return false;
     EqualsDemo other = (EqualsDemo)obj;
     if(b == null){
         if(other.b !=null)
            return false;
     }else if(!b.equals(other.b))
         return true;
     return true;
  }

 

  

 








以上是关于浅谈equals重写的主要内容,如果未能解决你的问题,请参考以下文章

转浅谈Java中的equals和==

浅谈Java中的equals和==

[转]浅谈Java中的equals和==

浅谈Java中的equals和==(转载)

为什么系列之重写equals方法必须重写hasCode方法?

重写equals方法(未完)