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方法,当比较基本类型时,使用“==”。