重写equals方法

简介: 我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系

我们在java程序中调用自带的equals方法时,你是否会有这样的疑问:明明我比较的数据都一样啊,为什么会返回false呢?有些人可能还会疑问,怎么有时候返回true?有时候返回false呢?这是为什么呢?其实是和Java底层人家写的equals方法逻辑有关系


equals()方法是做什么的?


英语角度:


b2b72db08e3b9a09e149ced3a799aec1.png


计算机角度:比较多个值是否相等


实战场景


先来看段代码我们脑海中有个场景吧!


User类


package StringEquals;
public class User {
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }
}


主函数


package StringEquals;
import java.util.ArrayList;
import java.util.Collection;
public class Main {
    public static void main(String[] args) {
        //实例化一个集合对象
        Collection c = new ArrayList();
        //实例化一个叫唐三的对象
        User tangsan1 = new User("唐三");
        //再次实例化一个叫唐三的对象
        User tangsan2 = new User("唐三");
        //把第一个tangsan1对象添加到集合中
        c.add(tangsan1);
        //判断集合中是否包含叫唐三的对象
        System.out.println(c.contains(tangsan2)); 
    }
}


客户端输出结果

6470c92edbe409d6a6e38e1cd219ff28.png


此时是不是就疑惑了,明明tangsan1和tangsan2这两个变量所指向的对象都叫唐三啊,集合中也有叫唐三的这个对象,那为什么在判断集合是否包含叫唐三的对象时返回false呢?这是为什么? 我们先来看看Java中底层定义的contains方法是如何进行逻辑判断的,如下图。


contains底层逻辑判断


b7f0680b2b60dd5a2ad62af763aaf145.png


通过进入到contains方法底层,发现在进行逻辑判断的时候会调用equals方法进行比较。我们通过debug单步调试进入到equals底层之后发现,如下图:


92786fd60a4c89fbd9dbed0bc30e639e.png


this==obj,这里实际上比较的是tangsan1和tangsan2这两个对象的内存地址,因为实例化时分别new了两个不同的User对象,所有tangsan1和tangsan2这两个变量实际上所存储的地址空间不同、指向的对象也不同。


内存图


我们在来画一张这个程序的内存图,看看每一个变量和对象再内存中是如何划分的,如下图:


6e624826fedc03eafd04e0446603b780.png


看出来有什么不同了吗?虽然在代码中tangsan1和tangsan2这两个变量所指向的对象都叫唐三,但是他们分别所指向的对象不同,这两个对象所指向的地址也不同。


重写equals方法


有些人可能就问了,我只想判断两个对象里面的数据是否相同,如何做?重写equals方法,代码如下:


User类


package StringEquals;
public class User {
    private String name;
    public User() {
    }
    public User(String name) {
        this.name = name;
    }
    //重写equals方法,比较连个对象里面的数据是否一致
    public boolean equals(Object o) {
        if (o == null || !(o instanceof User)) return false;
        if (o == this) return true;
        User u = (User) o;
        return u.name.equals(this.name);
    }
}


主函数


package StringEquals;
import java.util.ArrayList;
import java.util.Collection;
public class Main {
    public static void main(String[] args) {
        //实例化一个集合对象
        Collection c = new ArrayList();
        //实例化一个叫唐三的对象
        User tangsan1 = new User("唐三");
        //再次实例化一个叫唐三的对象
        User tangsan2 = new User("唐三");
        //把第一个tangsan1对象添加到集合中
        c.add(tangsan1);
        //判断集合中是否包含叫唐三的对象
        System.out.println(c.contains(tangsan2)); 
    }
}


客户端输出结果


94617f22e89a0b0f351f8a3aa6062882.png


这里我们重写了equals方法,之后在调用equals方法的时候,程序就会调用我们自己写的这个重写之后的equals方法,程序就会认为tangsan1也叫唐三,tangsan2也叫唐三,他们名字相同就是同一个人。


总结


  • 不重写:调用Objcet的equals方法,判断的是内存地址是否一致
  • 重写:调用自定义的equals方法,判断是内容是否一致
  • 存放在一个集合中的类型,一定要重写equals方法
相关文章
|
安全 网络安全 区块链
发现挖矿木马产生的网络安全,如何紧急应急响应
挖矿木马是利用各种方法入侵计算机,利用被入侵计算机的算力挖掘加密数字货币以牟取利益的木马。其既可以是一段自动化扫描、攻击的脚本,也可以集成在单个可执行文件中。挖矿木马为了能够长期在服务器中驻留,会采用多种安全对抗技术,如修改任务计划、修改防火墙配置、修改系统动态链接库等,使用这些技术手段严重时可能造成服务器业务中断。
|
Kubernetes 网络协议 前端开发
k8s更新策略-系列文章第一篇:蓝绿发布
k8s更新策略-系列文章第一篇:蓝绿发布
|
机器学习/深度学习 人工智能 自然语言处理
一文理解Skip-Gram上下文的预测算法
自然语言处理属于人工智能领域,它将人类语言当做文本或语音来处理,以使计算机和人类更相似,是人工智能最复杂的领域之一。 由于人类的语言数据格式没有固定的规则和条理,机器往往很难理解原始文本。
4805 0
|
12月前
|
传感器 数据采集 存储
基于51单片机的大棚环境检测系统设计
基于51单片机的大棚环境检测系统设计
764 0
|
运维 监控 安全
【专栏】11 个 Linux 网络命令学习和熟练运用这些命令是提升网络管理能力的基础
【4月更文挑战第28天】本文介绍了11个必备的Linux网络命令,包括ifconfig、ip、ping、traceroute、netstat、tcpdump、ss、telnet、ftp、ssh和nmap,这些命令在网络配置、故障排查和性能监控中发挥关键作用。通过实例分析,强调了它们在实际工作中的综合应用,帮助运维工程师提升效率和应对网络挑战。学习和熟练运用这些命令是提升网络管理能力的基础。
533 1
|
Python
【Python】已解决:(from docx import Document导包报错)ModuleNotFoundError: No module named ‘exceptions’
【Python】已解决:(from docx import Document导包报错)ModuleNotFoundError: No module named ‘exceptions’
1475 0
ArrayList集合常用方法,.set可以用来生成图片和赋值命名,array.remove(1),array.set(1,“xxxx”)可以修改指定位置,array.size可以获取元素的个数
ArrayList集合常用方法,.set可以用来生成图片和赋值命名,array.remove(1),array.set(1,“xxxx”)可以修改指定位置,array.size可以获取元素的个数
|
存储 关系型数据库 MySQL
MySQL小白教程(进阶篇):数据管理与高级查询
MySQL小白教程(进阶篇):数据管理与高级查询
|
存储 Go API
Go 怎么操作 OSS 阿里云对象存储?
Go 怎么操作 OSS 阿里云对象存储?
385 0
|
机器学习/深度学习 人工智能 自然语言处理