浅谈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;
  }

  

原文地址:https://www.cnblogs.com/stupid-chan/p/9634124.html

时间: 2024-10-05 12:29:35

浅谈equals重写的相关文章

浅谈equals和==

在java中equals和==都是用来作比较的,可是你知道他们之间有什么区别和联系吗? 首先,在Object类中,本质上equals和==都是一样的,如果查看源码,你会发现这里面equals的内部实现就是==: public boolean equals(Object obj) { return (this == obj); } 如果是比较两个Object对象的大小,直接用==就可以了. == 1.判断比较的两个对象是否是同一个对象,内存地址是否相同.2.比较的两个对象必须是同一类型的数据,否则

浅谈equals和==的区别

这个问题在面试或者源码分析都经常出现,先不着急,让我们来了解一下Java中的数据类型. java中的数据类型分为: 基本数据类型和引用数据类型. 基本数据类型 4种整数类型:int.long.byte.short 2种浮点数类型:float.double 1种字符类型:char 1种布尔类型:boolean 引用数据类型 类 接口 数组 一.== == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 对于

【转】浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈Java中的equals和==

浅谈Java中的equals和== 在初学Java时,可能会经常碰到下面的代码: 1 String str1 = new String("hello"); 2 String str2 = new String("hello"); 3 4 System.out.println(str1==str2); 5 System.out.println(str1.equals(str2)); 为什么第4行和第5行的输出结果不一样?==和equals方法之间的区别是什么?如果在初

浅谈==和equals

我之前一直没怎么研究过这两个比较规则,稀里糊涂的知道怎么比较,也一直没犯过错,一时犯晕,呼呼,突然间就像研究下, 简言之: == 是比较两个对象地址的值,着重于值对象的比较,值的比较用equals比较值引用对象其比较结果一定正确的,但不建议使用,显得不正规吧 实质上值引用是在栈中存储的,每个值在栈中是唯一的,栈中地址也是唯一的,比较的时候就是比较的地址值,因此如果两个或者多个引用对象的值相同,其指向栈中的 值地址必定是相同的 根据以上继续分析,equals是比较的两个或者多个对象的栈中存储的内容

浅谈Java中的hashcode方法 - 海 子

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 一.hashCode方法的作用 对于包含容器类型的程

浅谈 GetHashCode

我们知道,System.Object 类是 .NET Framework 中所有类的最终基类,它是类型层次结构的根,并为派生类提供低级别服务.通常不要求类声明从 Object 的继承,因为继承是隐式的.因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象.派生类可以而且确实重写这些方法中的某些,其中包括: Equals - 支持对象间的比较. Finalize - 在自动回收对象之前执行清理操作. GetHashCo

浅谈 编译器 &amp; 自然语言处理

============================================== copyright: KIRA-lzn ============================================== 转载请注明出处,这篇是我原创,翻版必究!!!!!!!!!!!!!!!!!!! ============================================== 如果觉得写个好,请留个言,点个赞. 自我介绍:本人13届 USTC 研一学生,菜鸟一枚,目前在int

浅谈JAVA中的“hashcode()”方法

浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法. 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现. 一.hashCode方法的作用 对于包含容器类型的程