equals

  众所周知,java 中的所有的类都继承自 Object 这个超类 ,他就是Java所有类的父类或祖先类,Object类里面有一个equals方法,并且提供了默认的实现,如下所示。

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

  从上面代码得知:如果自定的类没有覆盖 equals 方法,那么该方法是来判断两个对象是否相等。

  而在实际使用常常需要覆写这个方法来改变判断两个对象在实际现实中是否相等。比如,判断学生是否为同一个人时,经常以学号(ID)来进行判断。如下代码片段,

public boolean equals(Object otherObject){

        //1. 出于性能优化的考虑,首先判断是否是自身比较 

        if(this == otherObject) return true; 

    //2. 出于安全性的检测

    if(null == otherObject) return false;

    //3. 测试比较的对象是否是同一类型

        if(!(otherObject.getClass() == this.getClass())) return false;

    //4. 类型转换

    PingPong other = (PingPong)otherObject;

    //5. 根据业务需要对需要比较的成员变量进行逐一比较

    //如果比较项都相同则返回为true

    if(other.getId() == this.getId) return true;

    return false;

}

  在Java规范中,它对equals()方法的使用必须要遵循如下几个规则:

  equals 方法在非空对象引用上实现相等关系:

  1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

  2、对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

  3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

   4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

  5、 对于任何非空引用值 x,x.equals(null) 都应返回 false。

  对于上面几个规则,我们在使用的过程中最好遵守,否则会出现意想不到的错误。

" == " 与 equals 的不同

  == 是一个操作符,操作符的左右两边变量既可以是基本类型也可是对象类型。当==应用于基本类型的时候,是用于判断操作符左右两边的变量存储的值是否相等;当==应用于对象类型的时候是用于判断操作符左边的对象是否是同一对象(地址值是否相等)。

案例分析

String str1 = "猜一猜";
String str2 = "猜一猜";
String str3 = new String("猜一猜");
boolean ret;
ret = (str1 == str2); //?
ret = (str1.equals(str2)); //?
ret = (str1 == str3); //?
ret = (str1.equals(str3)); //?
ret = (str1 == str1.trim()); //?
ret = (str1 == str2); 
//true:str1与str2均为直接量。对于直接量的字符串,Java从性能上有优化机制:
//Java为了避免在一个系统中产生大量的String对象;
//设计了一个字符串常量池容纳String对象。创建一个字符串
//时,首先检查池中是否有字符串内容相等的字符串;如果有则
//直接返回池中该对象的引用;否则创建并放入池中.
ret = (str1.equals(str2));
//true:String类的equals方法用于检查字符串内容相等
ret = (str1 == str3);    
//false:直接量和对象之间的关系与两个直接量之间的关系不同
ret = (str1.equals(str3)); 
//true:String类的equals方法用于检查字符串内容相等
ret = (str1 == str1.trim());
//true:调用trim方法的字符串对象,返回值仍然为该对象的引用

输出结果

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

String 类的 equals 重写代码

为什么 字符串的直接赋值与 new 一个对象用 “==”比较会不一样?

  java中,所有的引用放在栈内存中,所有的值放在堆内存中,而堆又分好多块,new 对象必然开辟对空间,放在大众的堆空间中,这部分是内存独立的,
  所以如果有字符串String s1=new String(“猜”);那么如果有String s2=new String(“猜”);那么s1,s2都会被分配内存空间,地址就不一样。
  而直接赋值是放在堆空间中的“串池”中,它里面放的是具体的数值,常量,比如说ASCII,基本数据,等等,这块区域的数值是共享的。也就是说:
  假如有字符串String s1 = "猜"和字符串String s2="猜";那么字符串s2是不占用内存空间的,会直接把s2的引用指向“串池”中的“123”,所以s1和s2的地址一样。
  至于直接new 的和直接赋值的,不用说了,存放的内存空间都不一样,自然地址也就不一样,而操作符“==" 是直接比较地址值。

小结

equals是类的成员方法

只能用于对象之间的比较,不能用于基本类型

  如果一个自定义类不覆盖Object的equals方法,那么equals就是用于判断两个对象是否是同一个引用,意即是否是指向同一内存区域的首地址。

  如果自定义类覆盖了Object的equals方法,那么则按照该方法自定义的业务逻辑进行判断,一般是用于判断两个对象的全部或部分内容是否相同。

==  既可以用于对象之间的比较,也可以用于基本类型。

  == 一方面可判断基本类型的值是否相等。

  Java基本类型包括了浮点型(float、double);整型(byte、short、int、long);字符型(char);布尔型(boolean)。但是,由于精度的问题,不建议==用于浮点型的比较,可采用两个浮点数相减并取绝对值,如果小于一个足够小的数(比如1.E-6)就认为是相等的。

  ==如果用于对象之间,则用于判断两者之间是否是同一个对象(指向的地址值)。

java —— equals 与 ==的更多相关文章

  1. 总结Java equals()和hashCode()的联系

    Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...

  2. java equals和==的区别

    大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...

  3. java equals 和 "==" 比较

    java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(== ...

  4. Java equals 和 hashcode 方法

    问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...

  5. Java equals的一个坑

    public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...

  6. java equals和==区别及string类的说明

    一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) {            return true;  ...

  7. java :equals()和hashcode()方法的结合使用

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...

  8. java equals()方法

    java基础学习总结--equals方法 一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class Te ...

  9. java equals 和 == 的区别

    )1. == 可以用来比较基本类型以及引用类型.在基本类型中 == 比较的是两个变量的值是否相等.在引用类型中,== 比较的是两个对象的内存地址是否相等. )2. equals 只能用来比较引用类型. ...

  10. java equals == contentEquals

    equals与== 经常用于比较,用法如下:字符串比较相同用equals,普通数值(基本数据类型)比较用==, contentEquals下面讲 理论准备: java的基本类型如int.float,d ...

随机推荐

  1. 设计模式学习(三): 装饰者模式 (附C#实现)

    需求 做一个咖啡店的订单系统. 买咖啡时,可以要求加入各种调料,如奶,豆浆,摩卡等.咖啡店会根据调料的不同收取不同的费用.订单系统要考虑这些. 初版设计 然后下面就是所有的咖啡....: cost方法 ...

  2. 为 MariaDB 配置远程访问权限

    最近在配置MySQL远程连接的时候发现我的MySQL数据库采用的是 MariaDB 引擎,与普通的数据库配置有点不同 经过查找资料终于完成了,特此记录方便以后查询 MariaDB 与普通的MySQL数 ...

  3. 三十分钟学会AWK

    摘要: 本文大部分内容翻译自我开始学习AWK时看到的一篇英文文章 AWK Tutorial ,觉得对AWK入门非常有帮助,所以对其进行了粗略的翻译,并对其中部分内容进行了删减或者补充,希望能为对AWK ...

  4. 基于 HTML5 的电力接线图 SCADA 应用

    在电力.油田燃气.供水管网等工业自动化领域 Web SCADA 的概念已经提出了多年,早些年的 Web SCADA 前端技术大部分还是基于 Flex.Silverlight 甚至 Applet 这样的 ...

  5. linux报错:命令未找到

    前段时间看到一个比较好玩的项目:[musicbox](https://github.com/darknessomi/musicbox) 开始用git clone安装,输入命令无法运行.开始以为安装有问 ...

  6. python模块-OS模块详解

    1.按字母分 os相关的函数:143个.按字母排序如下: ['abort', 'access', 'altsep', 'chdir', 'chmod', 'chown', 'chroot', 'clo ...

  7. 使用quartz实现不重启服务器修改自定义配置

    为了方便维护系统,开发中通常会设置一些自定义参数,写在单独的配置文件里,需要调整时可直接登录服务器修复配置文件,而不需要修改程序.但尴尬的是,web服务器并不会自动重新加载配置文件,重启服务器又会中断 ...

  8. Error : Invalid Allocation Size :·····Bytes 以及 abort() has been called

    把这两个Error放在一起,主要是因为在写代码的时候发现,他们有公共的错误. (一)Invalid Allocation Size 主要是因为new分配内存出了问题,从直观翻译来看,应该是内存分配长度 ...

  9. HDU 1754 I Hate It(线段树之单点更新,区间最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. Vijos P1035 贪婪的送礼者【模拟】

    贪婪的送礼者 描述 对于一群要互送礼物的朋友,你要确定每个人送出的礼物比收到的多多少. 在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人. 然而,在任何一群朋 ...