equals方法使用技巧
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
方法的建议
显示参数命名为
otherobject
,稍后将他转换成另一个叫做other的变量检测
this
与otherObject
是否引用同一个对象检测
otherObject
是否为null
,返回false
比较
this
与otherObject
是否属于同一个类如果
equals
的予以在每个子类中有所改变,就是用getClass
检测如果素有的子类拥有同意的语义,就使用
instanceof
检测
将
otherObject
转换为相应的类类型的变量对对象的域进行比较:使用
==
比较基本类型域,使用equals
比较对象域
equals方法使用技巧的更多相关文章
- Java的equals方法的使用技巧
Java的equals方法的使用技巧 1.业务场景: 在某个社交软件中,要求每个用户的用户名(name)必须独一无二,那么在每次增加新用户的时候,都要对该用户的注册名进行判断,如果当前用户名已经被占用 ...
- 两个对象用equals方法比较为true,它们的Hashcode值相同吗?
两个对象用equals方法比较为true,它们的Hashcode值相同吗? 答:不一定相同.正常情况下,因为equals()方法比较的就是对象在内存中的值,如果值相同,那么Hashcode值也应该相同 ...
- equals方法相关总结
先说一下Object类吧: 这是一个号称为祖宗类的东西,是所有类的父类,也是唯一一个没有父类的类. 接口不继承object类 并且Object类存在于java的lang包中,我们都知道存在于lang包 ...
- 一、基础篇--1.1Java基础-hashCode和equals方法的区别和联系
hashCode和equals方法的区别和联系 两个方法的定义 equals(Object obj)方法用来判断两个对象是否"相同",如果"相同"则返回tr ...
- List<T>Find方法,FindAll方法,Contains方法,Equals方法
假如传入的T是一个类, List<MessageInfos> MessageInfos = new List<MessageInfos>(); MessageInfos= Me ...
- [java] 更好的书写equals方法-汇率换算器的实现(4)
[java] 更好的书写equals方法-汇率换算器的实现(4) // */ // ]]> [java] 更好的书写equals方法-汇率换算器的实现(4) Table of Content ...
- java中的equals()方法重写
如何java中默认的equals方法跟实际不符的话,需要重写equals方法.例如: public class TestEquals { public static void main(String[ ...
- java提高篇(十三)-----equals()方法总结
equals() 超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等.该方法的源码如下: public boolean equals(Object obj) { retu ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
随机推荐
- 029-IIS配置
安装IIS.部署网站(发布或者拷贝都可以).修改连接字符串,compilation设为false,删掉cs代码上传文件夹不给执行权限: 在iis管理器中找到上传文件夹,选择属性--执行权限,设置为“无 ...
- linux关闭终端响铃
title: linux关闭终端响铃 date: 2018-01-25 15:10:14 tags: linux categories: linux 在终端输入或是直接在.bashrc里添加一行 xs ...
- linux下直接复制文件内容到剪切板
title: linux下直接复制文件内容到剪切板 date: 2017-11-23 17:00:06 tags: categories: Linux 首先安装xsel. xsel --input - ...
- sql语句中 “where 1=1” 的用处
通过拼凑sql语句,加入若干个where限制条件,如:select * from table "where conditionA" + ”and conditionB“ + ”an ...
- org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter)
通过start.spring.io下载maven工程导入eclipse后,出现pom文件错误: org.codehaus.plexus.archiver.jar.Manifest.write(java ...
- Docker Swarm 常用命令
# 管理配置文件 docker config # 查看已创建配置文件 - docker config ls # 将已有配置文件添加到docker配置文件中 - dock ...
- 节约内存:Instagram的Redis实践(转)
Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Inst ...
- python学习笔记:装饰器2
python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...
- MySql 中的<=>操作符
今天在学习数据库的索引优化时,关于memory存储引擎的的hash索引时,看到了操作符<=> ,这个操作符还是第一次见到,于是上网查了一下.我想大家应该知道 = != <> ...
- Learning-Python【32】:进程理论基础
什么是进程 进程就是一个程序在一个数据集上的一次动态执行过程.是用来描述程序执行过程的虚拟概念.进程的概念起源于操作系统,进程是操作系统最核心的概念,操作系统其它所有的概念都是围绕进程来的.进程一般由 ...