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. HttpRuntime.Cache .Net自带的缓存类

    .Net自带的缓存有两个,一个是Asp.Net的缓存 HttpContext.Cache,一个是.Net应用程序级别的缓存,HttpRuntime.Cache. MSDN上有解释说: HttpCont ...

  2. Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序

    当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...

  3. React Native学习(一)——搭建开发环境

    第一次接触React Native,首先搭建环境,过程还算顺利,不过也遇到了些问题,这里简单记录下来.中文官网(http://reactnative.cn/docs/0.47/getting-star ...

  4. Nginx概述和安装(1)

    一.Nginx概述 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 I ...

  5. 图书管理系统设置登录验证(cookies)

    先前做的图书管理登录页面虽然有那个页面,在你登录之后他会在数据库中查找值,然后验证,最后跳转到指定页面,,可是当你直接访问那个指定页面的时候不用登录也可以登录那个指定的页面: 由于前段时间已经做过图书 ...

  6. Promises-小程序购物车结算

    //结算提交 checkOut : function(){ var price = this.data.sum; var user = wx.getStorageSync('userInfo'); i ...

  7. Axios使用说明

    vue更新到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,前一段时间用了一下,现在说一下它的基本用法. 首先就是引入axios,如果你使用es6,只需要安装axios ...

  8. SPATRA的使用

    SPATRA是kali里的集成工具,可以自动化渗透测试 在命令行里键入:sparta即可进入 进去后单机左边空白处 输入你要进行渗透测试的IP 正在扫描中 点击bute可以进入hydra

  9. python端口扫描器

    吃了个火鸡面后感觉到了怀疑人生!!!!!!!!!妈耶,在也不吃了.思路都给辣没了!!! python端口扫描器代码如下: #-*-coding:utf-8 from socket import * i ...

  10. 剪邮票dfs+bfs+组合+结构体

    #include<iostream>#include<queue>using namespace std;struct Point{ int x; int y; };queue ...