栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

重写equals方法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

重写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方法

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866528.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号