关于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);
}
  1. 从源码中我们可以看出,equals未被重写的时候,它的作用是用来比较两个引用数据类型的对象的引用是否相同。
  2. 但是我们实际开发中,更多的是两个对象的具体数值是否相同,当两个对象的具体值相同时,我们一般就认为它们是相等的,所以我们需要去重写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
}
}
  1. 我们再将String重写过后的equals源码和和未重写的进行比较,我们就可以发现重写之后的String的equals方法是原方法的升级版。
  2. 首先它也对两个引用进行了比较,同时也比较了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;
}
  1. 这里Java10.0版本对String类的equals方法进行了升级。
  2. 因为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方法和==在判断相等上的区别

  1. ==既可以判断基本数据类型,又可以判断引用数据类型,判断基本数据类型时是判断值是否相等,而判断引用数据类型时是判断引用地址是否相等
  2. 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方法的更多相关文章

  1. 【转】彻底弄懂Java中的equals()方法以及与"=="的区别

    彻底弄懂Java中的equals()方法以及与"=="的区别 一.问题描述:今天在用Java实现需求的时候,发现equals()和“==”的功能傻傻分不清,导致结果产生巨大的偏差. ...

  2. 一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

    Java中重写equals方法为什么要重写hashcode方法? 直接看下面的例子: 首先我们只重写equals()方法 public class Test { public static void ...

  3. Java中“==”与equals方法的区别

    1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:St ...

  4. JAVA中复写equals方法

    在JAVA中“==”用于比较两个引用对象的地址是否相同.但是如果我们想比较两个对象的内容是否相同,通常会覆写equals方法.equals方法用来比较两个对象的内容是否相等. package org. ...

  5. JAVA中“==”与equals()方法区别

    equals 方法是 java.lang.Object 类的方法 有两种用法说明: ()对于字符串变量来说,使用"=="和"equals()"方法比较字符串时, ...

  6. 如何在Java中避免equals方法的隐藏陷阱

    摘要 本文描述重载equals方法的技术,这种技术即使是具现类的子类增加了字段也能保证equal语义的正确性. 在<Effective Java>的第8项中,Josh Bloch描述了当继 ...

  7. 如何重写Java中的equals方法

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  8. java中的equals方法

    这个方法首先比较的是两个对象的地址是否相同,如果相同直接返回true, 否则, (1)如果是string类型的先比较是否是string类型,是的话,再比较是否长度相同,相同的话再比较,每个字符是否相同 ...

  9. Java中的equals方法和自定义比较器

    Object中的equals()方法默认是按地址比较,而不按内容进行比较, public boolean equals(Object obj) { return (this == obj); } 在S ...

随机推荐

  1. 【CodeChef】QTREE- Queries on tree again!

    题解 给你一棵基环树,环长为奇数(两点间最短路径只有一条) 维护两点间路径最大子段和,支持把一条路径上的值取反 显然只要断开一条边维护树上的值,然后对于那条边分类讨论就好了 维护树上的值可以通过树链剖 ...

  2. 【BZOJ】2289: 【POJ Challenge】圆,圆,圆

    题解 二分一个横坐标,过这个横坐标做一条和y轴平行的直线,相当于在这条直线上做区间覆盖,如果区间有交的话,那么答案是True 否则的话取两个不相交的区间,如果这两个圆相离或相切则不合法 否则看看相交的 ...

  3. .NET工作准备--02基础知识

    (已过时) 框架基础,语法基础,字符串&集合&流,常见类和接口; 02.net基础(重点) -第一部分 框架基础 1.基础概念 CTS(Common Type System),CLS( ...

  4. jqplot利用ajax传值画图表(利用jsp连接数据库)

    实现从数据库中取得数据,再把数据传给画jqplot的jsp界面!jsp界面再进行画图,画出我们所需的图表! 有两个jsp界面,7-12.jsp用来连接数据库,并把数据传给ajaxauto.jsp,aj ...

  5. DML和DQL 总结

    一:MySql的存储引擎 问题的引入: 由于不同用户对数据的容量,访问速度,数据安全性有着不同的要求. 为了满足不同用户的需求,mysql数据库采用多种存储引擎来进行数据的存储! 1.1:查询mysq ...

  6. [mysql] update……from……

    今天插入一条数据就像这样 limit ), , )) 然后报错: You can't specify target table 'categorys' for update in FROM claus ...

  7. java基础记录(一):开发环境的配置

    一.JDK的安装与环境变量配置 1.jdk下载与安装. jdk1.8.0_192下载地址 下载完成后,双击运行安装文件.可以选择你要安装的位置或者直接下一步,等待安装完成,最后关闭. 2.配置环境变量 ...

  8. KVM基于X86硬件辅助的虚拟化技术实现机制【转】

    内存虚拟化 Shadow Paging 作者 Shawn 在其中文博客中很详尽地介绍了 KVM 在只支持一级分页的 x86 平台上用 “Shadow Paging”进行 MMU 虚拟化的实现,由于目前 ...

  9. Ural 2036. Intersect Until You're Sick of It 计算几何

    2036. Intersect Until You're Sick of It 题目连接: http://acm.timus.ru/problem.aspx?space=1&num=2036 ...

  10. Tesseract ocr 3.02学习记录一

    光学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印行 ...