equals方法的源码解析
阅读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; }