Skip to content

equals 方法


Object 类方法

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

基本介绍

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

说明:Object 是所有类的父类,如果不重写 equals 方法,在调用时,由于继承关系,优先看本类是否有 equals 方法,如果没有,则调用父类的 equals 方法

(2)默认判断地址是否相等,子类往往重写该方法,

例如:Integer、String 重写了 equals 方法,用于判断内容是否相等

源码分析

Object 中的 equals

java
public boolean equals(Object obj) {
    // 判断是否是同一个对象
    return (this == obj);
}

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

代码分析

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

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