返回顶部
首页 > 资讯 > 后端开发 > Python >Java中equals()方法实例详解
  • 449
分享到

Java中equals()方法实例详解

2024-04-02 19:04:59 449人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录equals()在哪里Java中重写的equals()在Java中比较的推荐方法为什么要在我们自己的类中重写equals()重写equals()的规范重写equals()可能的误

equals()在哪里

首先我们知道Java中Object类是所有类的父类,它里面定义了equals()方法:


    public boolean equals(Object obj) {
        return (this == obj);
    }

可以看到是使用= =来进行比较的,那么= =是什么意思呢?其实是比较两个对象的的内存地址。(这里顺便提一下,可以去了解一下Java的堆栈。)

=》若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。

Java中重写的equals()

这里我们看一下java的一些自带的包装类怎么重写equals()的:

String.java


    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()方法是进行内容比较,而不是单纯的引用比较。

Integer.java


    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

其他的就不一一举例了。

在Java中比较的推荐方法

所以我们一般比较基本数据类型的时候,使用"==",例如 int i = 0; if (i == 1){…},比较两个Integer包装类类型的时候就可以使用equals(),因为Java已经重写了equals()方法了。另外给出几点建议,在java中进行比较,我们需要根据比较的类型来选择合适的比较方式:

  1. 对象域,使用equals方法 。
  2. 类型安全的枚举,使用equals或== 。
  3. 可能为null的对象域 : 使用==null 和 equals 。
  4. 数组域 : 使用 Arrays.equals 。
  5. 除float和double外的原始数据类型(int,byte等) : 使用 == 。
  6. float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。
  7. double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

其中6,7参考java中的对应的包装类实现:


public boolean equals(Object obj) {
    return (obj instanceof Float)
           && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }
}

为什么要在我们自己的类中重写equals()

但是有时候我们不满足于使用基本数据类型和Java实现的一些继承自Object的哪些类,比如我们实现一个Person类,它是继承自Object类的,所以它的equals()方法默认使用的是文章开头提到的哪个equals()方法,当我们使用equals()进行比较的时候,比较内存地址,那么有可能出现两个Person对象的参数都相同(比如年龄,身份证号等,在我们的实际认知中认为这两个人就是一个人,应该返回true),但是由于他们的内存地址是不一样的,所以equals()方法会返回false。

那么我们就需要去重写equals()方法。

重写equals()的规范

需要注意的是,在Java规范中,它对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 或始终返回4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回false,前提是对象上 equals 比较中所用的信息没有被修改
  5. 对于任何非空引用值 x,x.equals(null) 都应返回false。

重写equals()可能的误区

查看下述代码:


public class TestEquals {
    public static void main(String[] args) {
        Employee employee = new Employee("mily",1);
        Employee employee2 = new Employee("mily",2);
        Person p1 = new Person("mily");
        
        System.out.println(p1.equals(employee));
        System.out.println(p1.equals(employee2));
        System.out.println(employee.equals(employee2));
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj instanceof Person) {
            Person person = (Person) obj;
            if (person.getName() == null | name == null) {
                return false;
            } else {
                return name.equalsIgnoreCase(person.getName());
            }
        }

        return false;
    }
}

class Employee extends Person {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name, int id) {
        super(name);
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {

        if (obj instanceof Employee) {
            Employee employee = (Employee) obj;
            return super.equals(obj) && employee.getId() == id;
        }

        return false;
    }
}

输出:

true

true

false

上述代码中,我定义了一个Person类,有一个属性name;还定义了一个Employee类,它是Person的子类,多出一个id的属性;在测试代码中“new”出了三个对象:

  1. name为mily,id为1的一个职员 —— employee
  2. name为mily,id为2的职员 —— employee2
  3. name为mily的一个普通人 —— p1

在大家的认知下,应该是三者都不是“equal”的,但是在执行 p1.equals(employee)时返回的是true,仔细看了代码之后你就会发现问题所在,代码把employee当成一个Person对象去执行equals方法了,比较了name发现一样,就认为是“equal”了,这是一种很常见的误区。

一般的equals()写法

下面给出一个完美的 equals 方法的建议:

1、显示参数命名为 otherObject,稍后会将它转换成另一个叫做 other 的变量。

2、判断比较的两个对象引用是否相等,如果引用相等那么表示是同一个对象,那么当然相等

3、如果 otherObject 为 null,直接返回false,表示不相等

4、比较 this 和 otherObject 是否是同一个类:如果 equals 的语义在每个子类中有所改变,就使用 getClass 检测;如果所有的子类都有统一的定义,那么使用 instanceof 检测

5、将 otherObject 转换成对应的类类型变量

6、最后对对象的属性进行比较。使用 == 比较基本类型,使用 equals 比较对象。如果都相等则返回true,否则返回false。注意如果是在子类中定义equals,则要包含 super.equals(other)

按照上述的equals()规范,我的实现如下:


public class TestEquals2 {
    public static void main(String[] args) {
        Employee employee = new Employee("mily",1);
        Employee employee2 = new Employee("mily",1);
        Person p1 = new Person("mily");

        System.out.println(p1.equals(employee));
        System.out.println(p1.equals(employee2));
        System.out.println(employee.equals(employee2));

        Employee employee3 = new Employee(null,1);
        Employee employee4 = new Employee(null,1);
        Person p2 = new Person(null);
        System.out.println(p2.equals(employee3));
        System.out.println(p2.equals(employee4));
        System.out.println(employee3.equals(employee4));
    }
}

class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Person(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }

        if(obj == null || getClass() != obj.getClass()){
            return false;
        }

        Person person = (Person) obj;
        if(person.getName() == null | name == null) {
            return false;
        } else {
            return name.equalsIgnoreCase(person.getName());
        }

    }
}

class Employee extends Person {

    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Employee(String name, int id) {
        super(name);
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }

        if(obj == null || getClass() != obj.getClass()){
            return false;
        }

        Employee employee = (Employee) obj;
        if(employee.getName() == null | getName() == null) {
            return false;
        }else {
            return getName().equalsIgnoreCase(employee.getName()) && employee.getId() == id;
        }

    }
}

结果:

false

false

true

false

false

false

附:java中equals()方法的正确使用

在Java中比较两个字符串是否相等,想必只要不是初学者都知道用equals()方法来进行比较,但是实际上很多时候都用错了。

就我自己开发而言,加入比较一个String s的内容是否是"aaa"时,往往会写成如下代码:


if(s.equals("aaa")){
    ...
}

乍一看没什么问题,直到我装了Alibaba coding Guidelines 这个插件,一检查,就告诉我这样不对了。

为什么呢?因为很多情况下,并不能保证字符串s是不是为null,即直接这么判断,很容易产生空指针异常的错误,因此正确的使用方法应该是:


"aaa".equals(s);

总结

到此这篇关于Java中equals()方法的文章就介绍到这了,更多相关Java equals()方法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中equals()方法实例详解

本文链接: https://lsjlt.com/news/160751.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中equals()方法实例详解
    目录equals()在哪里Java中重写的equals()在Java中比较的推荐方法为什么要在我们自己的类中重写equals()重写equals()的规范重写equals()可能的误...
    99+
    2024-04-02
  • java中重写equals()方法的同时要重写hashcode()方法(详解)
    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;注意:当此方法被重写时,通常有必要重写 hashCod...
    99+
    2023-05-31
    java equals hashcode
  • java 中createStatement()方法的实例详解
    java 中createStatement()方法的实例详解用缺省设置创建时,ResultSet 是一种只能访问一次(one-time-through)、只能向前访问(forward-only)和只读的对象。您只能访问数据一次,如果再次需要...
    99+
    2023-05-31
    java createstatement() ava
  • Java中equals和==的区别详解
    目录1.java中的数据类型,可分为两类: 2.再稍微改动一下程序,会有更奇怪的发现: 3. 字符串缓冲池 4.再次更改程序: 总结1.java中的数据类型,可分为两类: 1.基本...
    99+
    2024-04-02
  • 详解Java中==和equals()的区别
    目录1. ==1.1 基本数据类型1.2 引用数据类型1.3 小结2. equals3. 总结1. == == 是运算符,用来判断两个值是否相等,==可以使用在基本数据类型变量和引用...
    99+
    2024-04-02
  • Java Object类equals方法
    基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入;Object类是所有Java类的祖先。每个类都使用 Ob...
    99+
    2024-04-02
  • 怎么Java中重写equals方法
    怎么Java中重写equals方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,...
    99+
    2023-05-30
    java equals
  • java中的equals方法如何使用
    在Java中,equals()方法用于比较两个对象是否相等。equals()方法是Java中的Object类的方法,所有的对象都继承...
    99+
    2023-09-15
    java
  • Java中的String类getBytes()方法详解与实例
    简介 Java中的String类提供了getBytes()方法,用于将字符串转换为字节数组。该方法允许在不同的字符编码方式下进行转换,从而实现字符串和字节数据之间的互相转换。本文将详细解释getBytes()方法的用法和参数,提供完整的实例...
    99+
    2023-09-13
    java 开发语言
  • 如何在Java中使用equals()方法实现重写
    如何在Java中使用equals()方法实现重写?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java中equals()方法重写实现代码  Java中的equals(...
    99+
    2023-05-31
    java equals() 重写
  • 浅谈java中==以及equals方法的用法
    equals 方法是 java.lang.Object 类的方法。有两种用法说明:(1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。“==”比较两个变量本身的值,即两个对象在内存中的首地址。“eq...
    99+
    2023-05-30
    java equals方法 ava
  • Java BigDecimal中divide方法案例详解
    1、首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算。其中有这么一个方法. public BigDecimal divide(BigDecimal d...
    99+
    2024-04-02
  • java equals()方法如何使用
    这篇文章主要介绍了java equals()方法如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java equals()方法如何使用文章都会有所收获,下面我们一起来看看吧。在java中,equals()...
    99+
    2023-07-04
  • java equals方法怎么使用
    这篇文章主要介绍“java equals方法怎么使用”,在日常操作中,相信很多人在java equals方法怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java equals方法怎么使用”的疑惑有所...
    99+
    2023-07-05
  • Java中如何正确重写equals方法
    目录1. 什么是equals方法?1.1 equals方法:2. 为什么要重写equals方法?2.1 举个例子吧~3. 分析equals源码:4. 正确重写equals方法:重写e...
    99+
    2024-04-02
  • java中equals方法的作用是什么
    在Java中,equals()方法主要用于比较两个对象是否相等。它是Object类的方法,因此在所有的Java类中都可以使用。equ...
    99+
    2023-09-12
    Java
  • == 与equals()方法如何在Java中使用
    == 与equals()方法如何在Java中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java中的== 和equals()方法:Java中的数据类型,可分为两类:1...
    99+
    2023-05-31
    java == equals()
  • equals()方法和hashCode()方法(详细介绍)
    Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。本文介...
    99+
    2014-05-14
    java教程 Java
  • Java 中This用法的实例详解
     Java 中This用法的实例详解用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法。    那们类里面是够也应该有一个引用来访问自己的属性和方法纳?&n...
    99+
    2023-05-31
    java this ava
  • MongoDB中aggregate()方法实例详解
    目录前言1,了解aggergate()方法2,实现聚合表达式运算符总结前言 MongoDB的一个很大的好处是能够使用MapReduce来吧数据库查询的结果简化成一个与原来的集合完全不同的结构。MapReduce把一个数据...
    99+
    2023-01-03
    mongodb中aggregate用法 mongodb aggregate()方法 mongodb aggregate
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作