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. 总结Oracle8i 的UNDO表空间损坏(ORA-01092及ORA-00600【4193】)情况下的数据库不完全恢复的经历

    服务器断电重启导致备份生产环境的恢复目录库无法进行启动,提示Ora-01092例程终止.强行断开连接 查看跟踪日志: Wed Jan 10 08:41:37 2018 Errors in file d ...

  2. Java学习笔记9(面向对象二:this、继承、抽象类)

    就近原则: 类中的方法中的变量和成员变量重名时,调用类的方法时候,生效的是方法中的变量,如果方法中没有定义变量,才会去成员变量中寻找 于是,提出了this关键字,为了区分重名问题 public cla ...

  3. Appium Mac 命令行安装

    试过很多方法都失败,打算用命令行方式安装. 准备工作: 从 https://github.com/appium/appium下载appium版本的源码(.tar) 详见github_Appium1.6 ...

  4. bootstrapru软件官网

    一    bootstrap:http://v3.bootcss.com/ 二   起步:http://v3.bootcss.com/getting-started/ 三    全局css样式:htt ...

  5. newlisp

    Windows で使う場合 Windoows用のインストーラからインストールすると.newLISP のIDE用のアイコンが出来るのでそこから使ってもいいし.コマンドプロンプトで newlisp と入力 ...

  6. JMeter-接口自动化之正则表达式关联

    jmeter中,接口自动化的关键在于参数关联.比如需要登录的接口,如何调用登录口令?一个增删改查的闭环,如何将接口参数上下传递?下面就以实际的例子来仔细说一说 1:登录接口 这里有一个实际的登录接口, ...

  7. [转]解析多级json数据为list中嵌套一级字典的形式

    #!/usr/bin/env python # encoding: utf-8 import json def read(obj,key): collect = list() for k in obj ...

  8. JS 生成唯一数字

    如题,在JS中,利用Date.getTime()来生成唯一数字,用于ID function uniqueNumber() { var date = Date.now(); if (date <= ...

  9. faster-rcnn系列笔记(一)

    目录: 1. 序言 2.正文 2.1  关于ROI 2.2  关于RPN 2.3 关于anchor 3. 关于数据集合制作 4. 关于参数设置 5. 参考 1.序言 叽歪一下目标检测这个模型吧,这篇笔 ...

  10. MongoDB批量操作及与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite()方法的使用.顺带与关系型数据库MySQL进行对比,比较这两种不同类型数据库的效率.如果只是想学习bulkWrite()的 ...