歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java常見問題之引用相等性和對象相等性

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

日期:2017/3/1 9:34:29   编辑:Linux編程

==和!=用來比較引用相等性,無論何時都是比較兩個對象是不是位於堆上的同一個對象。

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

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

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

注意如果兩個對象equal,則它們的hashcode值必須相同(所以如果覆蓋了equals()方法,也必須同時覆蓋hashCode()方法),但是如果兩個對象具有相同的hashcode值,它們不一定equal,所以hashcode值相同的對象還需要調用equals()來判斷是否真的相等。

另外,String類已經覆蓋了hashCode()和equals()方法,所以String類的hashCode()和equals()方法執行的是對象相等性的比較。

Copyright © Linux教程網 All Rights Reserved