java —— equals 与 ==
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 与 ==的更多相关文章
- 总结Java equals()和hashCode()的联系
Java equals()和hashCode()的联系 如果两个对象是相等的,那么它们必须有相同的哈希码. 如果两个对象具有相同的哈希码,他们可能相等,可能不相等. 如果两个对象是不同的类的实例 他们 ...
- java equals和==的区别
大概说equals和==都比较的是什么: 1. boolean tem = a == b; 首先==比较的肯定是地址,从堆栈的角度说也就是说==比较的是栈上面的内容.因为栈是用来存放地址或是java中 ...
- java equals 和 "==" 比较
java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(== ...
- Java equals 和 hashcode 方法
问题 面试时经常会问起字符串比较相关的问题, 总结一下,大体是如下几个: 1.字符串比较时用的什么方法,内部实现如何? 2.hashcode的作用,以及重写equal方法,为什么要重写hashcode ...
- Java equals的一个坑
public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...
- java equals和==区别及string类的说明
一.equals和==的区别 1.1.equals之string字符串的比较 1.1.1.源码如下图 if (this == anObject) { return true; ...
- java :equals()和hashcode()方法的结合使用
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- java equals()方法
java基础学习总结--equals方法 一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 1 package cn.galc.test; 2 3 public class Te ...
- java equals 和 == 的区别
)1. == 可以用来比较基本类型以及引用类型.在基本类型中 == 比较的是两个变量的值是否相等.在引用类型中,== 比较的是两个对象的内存地址是否相等. )2. equals 只能用来比较引用类型. ...
- java equals == contentEquals
equals与== 经常用于比较,用法如下:字符串比较相同用equals,普通数值(基本数据类型)比较用==, contentEquals下面讲 理论准备: java的基本类型如int.float,d ...
随机推荐
- 第十七章:Python の Web开发基础(四) MVC与Django
本課主題 MVC 介绍 Django 介紹 MVC 介绍 controllers 处理用户请求 views 放置HTML模版 models 操作数据库 MVC框架就是目录的归类 MVC 是一种软件开发 ...
- android开发遇到的问题
1.虚拟机运行出下面的错Failed to allocate memory: 8 Failed to allocate memory: 8This application has requested ...
- C#中的异步学习
C#中的异步 C#5.0版本发布有一个"主题那就是异步编程. 我们先创建一个windowForm窗体,实现下面效果,然后我们通过简单的案例对比同步和异步: 首先我们编写一个耗时方法: /// ...
- 【LCT】BZOJ3091 城市旅行
3091: 城市旅行 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1927 Solved: 631[Submit][Status][Discuss ...
- 微信小程序之获取验证码js
在微信小程序中怎样实现获取验证码的倒计时功能捏,倒计时的原理是一样一样的,就是某些地方需要注意. 第一步:结构 <view class='get-code' wx:if="{{!isS ...
- Java集合系列[2]----LinkedList源码分析
上篇我们分析了ArrayList的底层实现,知道了ArrayList底层是基于数组实现的,因此具有查找修改快而插入删除慢的特点.本篇介绍的LinkedList是List接口的另一种实现,它的底层是基于 ...
- Scala之String
一.前言 大数据领域的Spark.Kafka.Summingbird等都是由Scala语言编写而成,相比Java而言,Scala更精炼.由于笔者从事大数据相关的工作,所以有必要好好学习Scala语言, ...
- GStreamer Windows tutorial demo 开发环境配置
GStreamer 示例程序在 Windows 环境配置时坑比较多,好不容易配置成功了,写篇文档分享一下安装的关键步骤 官方文档见:https://gstreamer.freedesktop.org/ ...
- CTF---Web入门第七题 猫抓老鼠
猫抓老鼠分值:10 来源: 实验吧 难度:难 参与人数:8697人 Get Flag:3740人 答题人数:3944人 解题通过率:95% catch!catch!catch!嘿嘿,不多说了,再说剧透 ...
- c语言基础学习06
=============================================================================涉及到的知识点有:1.C语言库函数.字符输入函 ...