Object类中的equals方法用于检测一个对象是否等于另外一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。

如果两个对象那个具有相同的引用,他们一定是相同的,从这方面看,将其作为默认操作也是合乎情理的。然而对于多数类来说,这种判断没有意义,通常我们需要将测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。

==equals的区别

  • 值类型(int,char,long,boolean等)都是用==判断相等性。对象引用的话,==判断引用所指的对象是否是同一个。
  • equals是Object的成员函数,有些类会覆盖(override)这个方法,用于判断对象的等价性。

例如String类,两个引用所指向的String都是”abc“,但可能出现他们实际对应的对象并不是同一个(和jvm实现方式有关),因此用==判断他们可能不相等,但用equals判断一定是相等的。总体来说要搞清楚,还是需要先理解清楚对象实体和引用之间的关系。

instanceof

instanceof是Java、php的一个二元操作符(运算符),和==,>,<是同一类东西。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据。可以用来判断继承中的子类的实例是否为父类的实现。相当于c#中的is操作符。java中的instanceof运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。

相等测试与继承

如果隐式和显式参数不属于同一个类,equals方法将如何处理呢?

public class Employee {
private String name;
private String hireDay;
private int salary; public boolean equals(Object otherObject) {
//首先简单的测试一下对象是否相等
if(this ==otherObject) return true; //判空
//如果这里不进行判空,会出现什么后果
if(otherObject ==null) return false; //如果对象所属类不匹配,则他们不相等
if(getClass() != otherObject.getClass()) return false; Employee other = (Employee) otherObject; //判断对象里面的内容是否相等
//若果在构造对象时,没有对里面一个或者多个内容进行赋值,即有些内容为null,这里或出现什么后果?
return name.equals(other.name)
&&salary == other.salary
&&hireDay.equals(other.hireDay);
} }

java语言的规范要求equals方法具有下面的特性

  • 对称性: 对于任何引用x和y,当且仅当x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true” ;

这里有一个问题:首先假设一个类的对象为y,其子类的对象为x,加入在equals中使用instanceof进行比较

y.equals(x);中会返回true

然而:x.equals(y) 会返回false

这不符合equals的对称性!!!

建议:

如果子类能够拥有自己的相等概念,则对称性需求将强制采取getClass进行检测

如果由超类决定相等的概念,那么就可以使用instanceof进行检测,这样可以在不同的子类的对象之间进行相等的比较。

  • 自反性: 对于任何非空引用x,x.equals(x)应该返回“true” ;

  • 传递性: 对于任何引用x和y,如果x.equals(y)返回是“true”,y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true” ;

  • 一致性: 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果

  • 对于任意非空引用x,x.equals(null)应该返回false

编写一个完美的equals方法的建议

  1. 显示参数命名为otherobject,稍后将他转换成另一个叫做other的变量

  2. 检测thisotherObject 是否引用同一个对象

  3. 检测otherObject 是否为null,返回false

  4. 比较thisotherObject是否属于同一个类

    • 如果equals的予以在每个子类中有所改变,就是用getClass检测

    • 如果素有的子类拥有同意的语义,就使用instanceof检测

  5. otherObject转换为相应的类类型的变量

  6. 对对象的域进行比较:使用==比较基本类型域,使用equals比较对象域

equals方法使用技巧的更多相关文章

  1. Java的equals方法的使用技巧

    Java的equals方法的使用技巧 1.业务场景: 在某个社交软件中,要求每个用户的用户名(name)必须独一无二,那么在每次增加新用户的时候,都要对该用户的注册名进行判断,如果当前用户名已经被占用 ...

  2. 两个对象用equals方法比较为true,它们的Hashcode值相同吗?

    两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...

  3. equals方法相关总结

    先说一下Object类吧: 这是一个号称为祖宗类的东西,是所有类的父类,也是唯一一个没有父类的类. 接口不继承object类 并且Object类存在于java的lang包中,我们都知道存在于lang包 ...

  4. 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系

     hashCode和equals方法的区别和联系  两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...

  5. List<T>Find方法,FindAll方法,Contains方法,Equals方法

    假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...

  6. [java] 更好的书写equals方法-汇率换算器的实现(4)

    [java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]>   [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...

  7. java中的equals()方法重写

    如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...

  8. java提高篇(十三)-----equals()方法总结

    equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...

  9. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

随机推荐

  1. git之概念图

    1.git四大区. . 2. 3. 4.

  2. Practical Lessons from Predicting Clicks on Ads at Facebook

    ABSTRACT 这篇paper中作者结合GBDT和LR,取得了很好的效果,比单个模型的效果高出3%.随后作者研究了对整体预测系统产生影响的几个因素,发现Feature(能挖掘出用户和广告的历史信息) ...

  3. url的参数解析成key-value

    function urlController(url) { var _url = url.split("?")[1]; if(!_url){ return {}; } var wi ...

  4. arcgis 制图-插值图

    1.生成插值图 插值工具: 方案1:Spatial Analyst 工具-->插值分析-->反距离权重法 (IDW) + Spatial Analyst 工具-->提取分析--> ...

  5. 20190402Linux常用命令week1.1

    Linux常用命令详解week1.1 基础命令:lsmanpwdcdmkdirechotouchcpmvrmrmdircatmorelessheadtailclearpoweroffreboot 命令 ...

  6. 模块 import 与from

    什么是模块:就是一系列功能的集合体 模块的来源 :1内置模块   2 第三方模块   3 自定义模块 模块的格式: 1 使用python编写的.py文件 2 已被编译为共享库或DLL的C或C++扩展 ...

  7. 剑指offer(20)包含min函数的栈

    题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 题目分析 首先一开始我们分析得到最小值肯定要比较嘛,和栈里面的数据一一比较,但是栈这种数据结构,你又只能和栈顶弹出来的 ...

  8. JS设计模式(13)状态模式

    什么是状态模式? 定义:将事物内部的每个状态分别封装成类,内部状态改变会产生不同行为. 主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为. 何时使用:代码中包含大 ...

  9. PTA编程总结1—打印沙漏

    题目:7-1 打印沙漏 (20 分) 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓&q ...

  10. msvc命令行cl编译c程序问题及解决

    1.cmd命令行cl提示没有这玩意儿 装上Visual Studio之类 2.cl main.c提示缺dll everything搜dll所在路径,在环境配置PATH增加对应bin.IDE 3.cl ...