阅读jdk API我们知道Object class在java.lang包下。Object class是Object结构的跟。
jdk1.8 API在线地址 :https://blog.fondme.cn/apidoc/jdk-1.8-baidu/
Object class中的方法有
hashCode(),equals(),clone(),notify(),notifyAll(),wait(),finalize()
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}
1.首先看equals()方法。
public boolean equals(Object obj) {
return (this == obj);
}
equals方法是用来比较其他对象是否等于此对象。
equals方法在非空对象引用上实现等价关系:
自反性:对于任何的非空的参考值x, x.equals(x) 应该返回true。
对称性:对于任何非空引用值x和y,x.equals(y)应该返回true,当且仅当y.equals(x)返回true。
传递性:对于任何非空引用值x,y,z 。x.equlas(y)返回true,y.equals (z)返回true。然后x.equals(z)应该返回true。
一致性:对于任何非空引用值x,y。多次调用x.equals (y) 始终返回true或false。在不修改x和y 的值的情况下一直成立。
对于任何非空参考值x,x.equals(null) 始终返回false。
该equals
类方法Object
实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值x
和y
,当且仅当x
和y
引用相同的对象( x == y
具有值true
)时,该方法返回true
。
请注意,无论何时覆盖该方法,通常需要覆盖hashCode
方法,以便维护hashCode
方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。
2. equals方法比较字符串是否相等时。
private final char value[];
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
//判断是否是String类型的实例
if (anObject instanceof String) {
String anotherString = (String)anObject; //强转为String类型
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;
}
3.equals判断对象是否相等时;
重写equals和hashCode方法
@Override
public boolean equals(Object o) {
if (this == o) return true; //判断内存地址是否相同 相同返回true
if (!(o instanceof UserInfo)) return false;//判断被比较的对象与此对象是否是同一类型的,不同类型返回false
UserInfo userInfo = (UserInfo) o;//强制类型转换 将被比较类型转换为此类型
//分别比较两对象的属性值时候相同 只要存在一个属性值不相同返回false 全部相同返回true
if (!getUserid().equals(userInfo.getUserid())) return false;
if (!getUname().equals(userInfo.getUname())) return false;
return getUage().equals(userInfo.getUage());
}
@Override
public int hashCode() {
int result = getUserid().hashCode();
result = 31 * result + getUname().hashCode();
result = 31 * result + getUage().hashCode();
return result;
}