equals和toString方法

Object类中含有equals和toString方法,先看下equals方法:

 public boolean equals(Object obj) {
        return (this == obj);
    }

可以看出,它比较的时两个对象的地址。因此,需要达到预期的效果,必须重写equals方法。

重写equals方法:

 public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Parcel11 parcel11 = (Parcel11) o;
        return age == parcel11.age &&
                height == parcel11.height &&
                Objects.equals(name, parcel11.name);
    }

toString方法:

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

默认为类名加16进制hash码。

因此需要使用的时候也需要进行重写。注意当输出对象时,默认会调用toString方法。

为何?

先看下println函数源码:

 public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }
public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

可以看到,当输入是一个object对象时,会调用String类的valueOf方法将其转为一个字符串,valueOf方法源码如下:

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

可以看到,如果obj不为空时,会调用toString方法。在String类中,已经重写了equals方法和toString方法。

源码如下:

重写的equals方法:

 public boolean equals(Object anObject) {
        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;
            }
        }
        return false;
    }

重写的toSring方法:

public String toString() {
        return this;
    }

因此,在进行比较时,就需要小心了,当比较引用类型变量(包括字符串)时,一般用equals方法,当比较基本类型时,使用“==”。

原文地址:https://www.cnblogs.com/xuhan74520/p/13885309.html