若是問你Java中==和equals()有何區別,相信你的第一反應會回答:==比較的是它們所指向的對象地址,而equals()方法比較的是它們的內容值。實際上,這樣的回答是不全面的。java
摘自《Java編程思想》一書中的原話:編程
關係操做符「==」生成的是一個boolean結果,它們計算的是操做數的值之間的關係。this
那麼關於==的比較,無外乎如下兩種狀況。spa
咱們知道,Java中全部的類都是由Object類派生出來的,在Object類中定義定義了equals()方法,其源碼以下:.net
public boolean equals(Object obj) { return (this == obj); }
也就是說,在沒有被重寫的狀況下,比較的是引用類型的變量所指向的對象的地址。code
那麼,有哪些經常使用的類equals()方法被重寫了?好比String類、包裝類、Date類都是。對象
String類equals()方法源碼:blog
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; }
包裝類,好比Integer中equals()方法源碼:get
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
這些被重寫的equals()方法的類,比較的是引用類型的變量所指向的對象存儲的內容是否相等,即比較它們的值。源碼
推薦閱讀 Java中包裝類型的大小比較