IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> equals 底层运行原理—重写 -> 正文阅读

[Java知识库]equals 底层运行原理—重写

目录

equals()方法是做什么的?

实战场景

contains底层逻辑判断

内存图

重写equals方法

总结


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

equals()方法是做什么的?

英语角度:

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

实战场景

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

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)); 
    }
}

客户端输出结果

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

contains底层逻辑判断

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

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

内存图

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

看出来有什么不同了吗?虽然在代码中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)); 
    }
}

客户端输出结果

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

总结

  • 不重写:调用Objcet的equals方法,判断的是内存地址是否一致
  • 重写:调用自定义的equals方法,判断是内容是否一致
  • 存放在一个集合中的类型,一定要重写equals方法

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-06 10:55:43  更:2022-05-06 10:56:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:46:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码