【Java学习笔记】equals方法

equals方法


Object类方法一览表

方法 说明
protected Object clone() 创建并返回此对象的一个副本。
boolean equals(Object obj) 指示其他某个对象是否与此对象"相等"。
protected void finalize() 当垃圾回收器确定不再有对该对象的更多引用时,由对象的垃圾回收器调用此方法。
Class<?> getClass() 返回此 Object 的运行时类。
int hashCode() 返回该对象的哈希码值。
void notify() 唤醒在此对象监视器上等待的单个线程。
void notifyAll() 唤醒在此对象监视器上等待的所有线程。
String toString() 返回该对象的字符串表示。
void wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
void wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。
void wait(long timeout, int nanos) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过某个线程中断当前线程,或超过指定的时间量前,导致当前线程等待。

介绍

(1)equals方法是Object类中的方法,只能判断引用类型

(2)默认判断地址是否相等,子类往往重写该方法,用于判断内容是否相等,例如:Integer,String

源码探求

(1)Object类中的equals方法源码

java 复制代码
public boolean equals(Object obj) {
        return (this == obj);
    }

(2)String类中的equals方法源码

java 复制代码
public boolean equals(Object anObject) {
    // 如果是同一个对象,返回true
    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;
        }
    }
    // 不是该对象,返回false
    return false;
}

体会重写equals方法

要求:判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false

java 复制代码
public class prr {
    public static void main(String[] args) {
        overideequals o1 = new overideequals(18,"jack");
        overideequals o2 = new overideequals(18,"jack");
        System.out.println(o1.equals(o2));
    }
}
class overideequals{
    int age;
    String name;

    public overideequals(){

    }

    public overideequals(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public boolean equals(Object obj) {
        // 如果是同一个对象就返回true
        if(this == obj){
            return true;
        }
        // 判断是否是该对象
        if(obj instanceof overideequals){
            overideequals o = (overideequals)obj;
            return this.age == o.age && this.name.equals(o.name);
        }

        // 如果不是该类,返回false
        return false;
    }
}

//返回结果
true

代码解析

equals方法是Object的子类,根据继承关系的方法调用机制和方法重写原则,优先在子类中寻找是否有equals方法,如果没有就调用父类的equals方法

本案例中对equals方法进行重写,即覆盖了父类的equals方法

相关推荐
代码山河5 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
学长毕设5 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
sbjdhjd5 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
释厄6236 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
zzu123zsw7 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号7 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠8 小时前
泛微OAe9-后端二开异步调用
java
海绵宝宝的月光宝盒9 小时前
14-AutoCAD-阵列命令应用与案例实战(AR)
经验分享·笔记·自动化·课程设计·制造·学习方法·cad
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法