天天看點

Java常見問題之引用相等性和對象相等性

==和!=用來比較引用相等性。

object類具有hashcode()和equals()方法,hashcode()傳回根據對象所在記憶體位置計算得到的一個值(即兩個對象的hashcode值一定不同),equals()執行兩個對象的==比較。是以如果一個類沒有覆寫hashcode()和equals()方法,則它的hashcode()和equals()方法執行的是引用相等性的比較。

如果想執行對象相等性的比較,就要覆寫hashcode()和equals()方法。

例如hashset類會采用如下方法比較加入的對象是否與已經存在的對象相等:首先調用hashcode()比較要加入的對象與已經存在的對象的hashcode值,如果不存在相等的hashcode值,則不存在與要加入對象相等的對象,可以加入該對象;如果存在相等的hashcode值,則調用equals()檢查hashcode相等的對象是否真的相等,如果兩者相等,則要加入的對象已經存在了,加入操作就不會發生。

注意不相等的對象可能具有相同的hashcode值,是以hashcode值相同的對象還需要調用equals()來判斷是否真的相等。

另外,string類已經覆寫了hashcode()和equals()方法,是以string類的hashcode()和equals()方法執行的是對象相等性的比較。