关于Java中的equals方法
关于Java中的equals方法
欢迎转载,但是请填写本人的博客园原址
https://www.cnblogs.com/JNovice/p/9347099.html
一、什么是equals方法
equals
方法是Object
类中的方法,根据Java的技术文档上的描述,其作用指示其他某个对象是否与此对象“相等”。
equals方法在非空对象引用上实现相等关系:
- 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
- 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
- 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
- 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
- 对于任何非空引用值 x,x.equals(null) 都应返回 false
- Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意
:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
参数
: obj - 要与之比较的引用对象。
返回
: 如果此对象与 obj 参数相同,则返回 true;否则返回 false。
二、equals的重写
(一)为什么要重写equals方法
1 //Obeject未被重写时equals方法的源码,StringBuffer的equals方法也是一样的,也未重写
public boolean equals(Object obj) {
return (this == obj);
}
- 从源码中我们可以看出,equals未被重写的时候,它的作用是用来比较两个引用数据类型的对象的引用是否相同。
- 但是我们实际开发中,更多的是两个对象的具体数值是否相同,当两个对象的具体值相同时,我们一般就认为它们是相等的,所以我们需要去重写equals方法
(二)String
类中对equals方法的重写
//个人String的equals方法的源码的简单解读
public boolean equals(Object anObject) {
if (this == anObject) {//先对地址值进行判断
return true;
}
if (anObject instanceof String) {//判断传入是否是字符串类型
String anotherString = (String)anObject;
int n = value.length;//此value时String的内部属性,是存储String字符串的char型数组
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;//以上都没有return的代表都不满足if条件,最终返回false
}
}
- 我们再将String重写过后的equals源码和和未重写的进行比较,我们就可以发现重写之后的String的equals方法是原方法的升级版。
- 首先它也对两个引用进行了比较,同时也比较了String的具体数值,当满足既是字符串类型又和本字符串的长度和具体内容全都相同时,那么此时才返回true
(三)Java10.0
的String类的equals方法
//Java10.0版本对equals重写的简单解读
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)//这里的Latin1是ISO-8859-1编码格式的别称
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
- 这里Java10.0版本对String类的equals方法进行了升级。
- 因为10.0版本的equals方法加入对编码格式的判定,这里的编码格式是Latin1(别名ISO-8859-1)和UTF-16。
注:以下列举几个其他的编码格式
- ASCII 英文字符集
- Unicode 国际通用字符集,注意Java语言是用Unicode编写的
- UTF-8
8-bit Unicode Transformation Format是一种针对Unicode的可变长度字符编码 - BIG5 台湾的大五码,表示繁体汉字
- GB2312 大陆使用最早、使用最广的简体中文字符集
- GBK GB2312的扩展,可以表示繁体中文
- GB18030 最新GBK拓展,中国所有非手持/嵌入式计算机系统的强制实施标准,可以表示汉字、维吾尔语、藏文等中华民族字符
三、
equals
方法和==
在判断相等上的区别
==
既可以判断基本数据类型,又可以判断引用数据类型,判断基本数据类型时是判断值是否相等,而判断引用数据类型时是判断引用地址是否相等equals
方法只能判断引用数据类型是否相等,在未被重写时与==
的判断方式一致,但是被重写之后不仅判断引用是否,而且判断对象的具体属性值是否相等
注:所有我们在判断String等引用数据类型是否相等时时一般都是用重写后的equals的方法,还有StringBuffer的equals方法未被重写
- 以下是实际代码演示
public class TestClass { public static void main(String[] args) {
String s1 = "123";
String s2 = new String("123");
System.out.println(s1 == s2);//由于s2是在堆空间的引用,因而和s1的引用地址不一样
System.out.println(s1.equals(s2));
//结果输出
//false
//true String s3 = "abc";
String s4 = "abc";
System.out.println(s3 == s4);//由于字符串是不可变的,当常量池中有这个字符串数值,就不再创建直接将引用给新的字符串对象
System.out.println(s3.equals(s4));
//结果输出
//true
//true
} }
注:补充下其他的数据类型如何对比
- 整型可以用==进行对比
- 字符串用equals进行对比
- 浮点型可以使用BigDecimal或者浮点型的包装类方法Float.floatToIntBits和Double.doubleToLongBits方法
- getHashCode方法
关于Java中的equals方法的更多相关文章
- 【转】彻底弄懂Java中的equals()方法以及与"=="的区别
彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...
- 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?
Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...
- Java中“==”与equals方法的区别
1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...
- JAVA中复写equals方法
在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...
- JAVA中“==”与equals()方法区别
equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...
- 如何在Java中避免equals方法的隐藏陷阱
摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...
- 如何重写Java中的equals方法
Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...
- java中的equals方法
这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...
- Java中的equals方法和自定义比较器
Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...
随机推荐
- 025 Spark中的广播变量原理以及测试(共享变量是spark中第二个抽象)
一:来源 1.说明 为啥要有这个广播变量呢. 一些常亮在Driver中定义,然后Task在Executor上执行. 如果,有多个任务在执行,每个任务需要,就会造成浪费. 二:共享变量的官网 1.官网 ...
- Python 保存数据的方法(4种方法)
Python 保存数据的方法: open函数保存 使用with open()新建对象 写入数据(这里使用的是爬取豆瓣读书中一本书的豆瓣短评作为例子) import requests from lxml ...
- 使用php mcrypt加密解密
数字签名:对数据和私钥进行hash运算得到消息摘要,连同消息本身一块发给客户端.数据签名强调客户端接收到的数据是来自特定服务端,服务端具有对数据不可否认性.客户端通过确认此次签名的正确性来判断拿到的消 ...
- ADNI以及study design简介
相关名词: MCI:轻度认知功能障碍 EMCI:早期认知障碍 MCI:轻度认知障碍 LMCI:晚期认知障碍 CN:认知正常的志愿者 DTI:doppler tissue imaging,多普勒组织显像 ...
- 【转】frameset 框架集使用语法,常用语后台。
XHTML 框架概述 框架的使用可以让浏览器“分割”成多个页面显示内容,常用于如网站后台管理这些菜单项目固定,且对美观性和搜索引擎要求不高的地方. 框架的优缺点 框架方便制作栏目导航,操作各栏目时不需 ...
- html (第四本书第1~3章参考)
前三章都不会的话 呵呵……
- Java并发(十八):阻塞队列BlockingQueue
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列. 这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空.当队列满时,存储元素的线程会等待队列可用. 阻塞队列常用于生产 ...
- BZOJ3009 : 集合
取一棵生成森林,根据题目限制可得,与一个点相连的多余的边数是$O(\sqrt{m})$级别的. 对于树边,每个点维护3棵权值线段树,依次保存它的儿子里各个集合的边. 再开3*3个分块数组,记录多余边以 ...
- 20172308《Java软件结构与数据结构》第四周学习总结
教材学习内容总结 第 6 章 列表 一. 列表集合 列表集合:一种概念性表示法,思想是使事物以线性列表的方式进行组织 特点: 列表集合没有内在的容量大小,它可以随着需要而增大 列表集合更具一般化,可以 ...
- Mui --- app与服务器之间的交互原理、mui ajax使用
1.APP与服务器之间的交互原理 app端(客户端)与服务端的交互其实理解起来和容易,客户端想服务器端发送请求,服务器端进行数据运算后返回最终结果.结果可以是多种格式: 1.text 文本格式 2.x ...