关于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. 1 //Obeject未被重写时equals方法的源码,StringBuffer的equals方法也是一样的,也未重写
  2. public boolean equals(Object obj) {
  3. return (this == obj);
  4. }
  1. 从源码中我们可以看出,equals未被重写的时候,它的作用是用来比较两个引用数据类型的对象的引用是否相同。
  2. 但是我们实际开发中,更多的是两个对象的具体数值是否相同,当两个对象的具体值相同时,我们一般就认为它们是相等的,所以我们需要去重写equals方法

(二)String类中对equals方法的重写

  1. //个人String的equals方法的源码的简单解读
  2. public boolean equals(Object anObject) {
  3. if (this == anObject) {//先对地址值进行判断
  4. return true;
  5. }
  6. if (anObject instanceof String) {//判断传入是否是字符串类型
  7. String anotherString = (String)anObject;
  8. int n = value.length;//此value时String的内部属性,是存储String字符串的char型数组
  9. if (n == anotherString.value.length) {//判断传入的字符串长度与本对象是否相等
  10. char v1[ ] = value;
  11. char v2[ ] = anotherString.value;
  12. int i = 0;
  13. while (n-- != 0) {//将字符串的每个字符进行比较
  14. if (v1[i] != v2[i])
  15. return false;
  16. i++;
  17. }
  18. return true;
  19. }
  20. }
  21. return false;//以上都没有return的代表都不满足if条件,最终返回false
  22. }
  23. }
  1. 我们再将String重写过后的equals源码和和未重写的进行比较,我们就可以发现重写之后的String的equals方法是原方法的升级版。
  2. 首先它也对两个引用进行了比较,同时也比较了String的具体数值,当满足既是字符串类型又和本字符串的长度和具体内容全都相同时,那么此时才返回true

(三)Java10.0的String类的equals方法

  1. //Java10.0版本对equals重写的简单解读
  2. public boolean equals(Object anObject) {
  3. if (this == anObject) {
  4. return true;
  5. }
  6. if (anObject instanceof String) {
  7. String aString = (String)anObject;
  8. if (coder() == aString.coder()) {
  9. return isLatin1() ? StringLatin1.equals(value, aString.value)//这里的Latin1是ISO-8859-1编码格式的别称
  10. : StringUTF16.equals(value, aString.value);
  11. }
  12. }
  13. return false;
  14. }
  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方法未被重写

  •   以下是实际代码演示
  1. public class TestClass {
  2.  
  3. public static void main(String[] args) {
  4. String s1 = "123";
  5. String s2 = new String("123");
  6. System.out.println(s1 == s2);//由于s2是在堆空间的引用,因而和s1的引用地址不一样
  7. System.out.println(s1.equals(s2));
  8. //结果输出
  9. //false
  10. //true
  11.  
  12. String s3 = "abc";
  13. String s4 = "abc";
  14. System.out.println(s3 == s4);//由于字符串是不可变的,当常量池中有这个字符串数值,就不再创建直接将引用给新的字符串对象
  15. System.out.println(s3.equals(s4));
  16. //结果输出
  17. //true
  18. //true
  19. }
  20.  
  21. }

  注:补充下其他的数据类型如何对比

    •   整型可以用==进行对比
    •   字符串用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. Gitlab Webhooks, External Services, and API(二)

    一. 使用webhooks webhook 是一个API的概念,并且变得越来越流行.我们能用事件描述的事物越多,webhook的作用范围也就越大.webhook作为 个轻量的事件处理应用,正变得越来越 ...

  2. 【Java】 大话数据结构(14) 排序算法(1) (冒泡排序及其优化)

    本文根据<大话数据结构>一书,实现了Java版的冒泡排序. 更多:数据结构与算法合集 基本概念 基本思想:将相邻的元素两两比较,根据大小关系交换位置,直到完成排序. 对n个数组成的无序数列 ...

  3. 001.Git简介与安装

    一 git介绍 1.1 概述 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放 ...

  4. querySelector/querySelectorAll选择器两个容易忽略的点

    jquery写得多了,原生js大API就容易忘.如果你也是这样,一起来回顾一下HTML5的类jquery选择器querySelector和querySelectorAll吧,querySelector ...

  5. 有多少种JVM

    https://en.wikipedia.org/wiki/Comparison_of_Java_virtual_machines 在这个类别下,主流选择有:(按流行程度递减) HotSpot VM ...

  6. 使用Synchronized块同步变量

    我们可以通过synchronized块来同步特定的静态或非静态方法.要想实现这种需求必须为这些特定的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这个类变量作为参数传 ...

  7. BZOJ.2595.[WC2008]游览计划(DP 斯坦纳树)

    题目链接 f[i][s]表示以i为根节点,当前关键点的连通状态为s(每个点是否已与i连通)时的最优解.i是枚举得到的根节点,有了根节点就容易DP了. 那么i为根节点时,其状态s的更新为 \(f[i][ ...

  8. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  9. JavaScript学习笔记[0]

    JavaScript学习笔记[0] 使用的是廖雪峰JavaScript教程. 数据类型 Number 表示数字,不区分浮点整形. === 比较时不转化数据类型. == 反之. NaN与任何值都不想等, ...

  10. javascript 正则限制文本输入框只允许输入数字,简单实现。

    <input type="text" id="memberId" lay-verify="title" autocomplete=&q ...