Java equal 和 hashcode

1、public boolean equals​(Object obj)

指示某個其他對象是否“等於”這個對象。
equals方法實現了非空對象引用的等價關係:

  • It is reflexive(反身的):對於任何非空的引用值x, x.equals(x)應該返回true。
  • 對稱性(symmetric):對於任何非空的引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)返回true。
  • 傳遞性(transitive):對於任何非空的引用值x、y和z,如果x.equals(y)返回true,而y.equals(z)返回true,那麼x.equals(z)應該返回true。
  • 一致性(consistent):對於任何非空引用值x和y,如果未修改對象的equals比較中使用的信息,則多次調用x.equals(y)始終返回true或始終返回false。
  • 對於任何非空的引用值x, x.equals(null)應該返回false。

類對象的equals方法實現了對對象儘可能區別的等價關係;也就是說,對於任何非空的參考值x和y,當且僅當x和y指向相同的對象時,該方法返回true (x == y的值爲true)。

請注意,通常需要在重寫hashCode方法時重寫該方法,以便維護hashCode方法的常規契約,該契約規定相等的對象必須具有相等的hash code。

2、public int hashCode()

返回對象的哈希碼值。支持此方法的好處是可以使用HashMap提供的散列表
hashcode 的一般規約:

  • 在Java應用程序的執行過程中,無論何時在同一個對象上多次調用它,hashCode方法都必須一致地返回相同的整數,前提是不對對象上的equals比較中使用的信息進行修改。此整數不需要在應用程序的一次執行與同一應用程序的另一次執行之間保持一致。
  • 如果根據equals(Object)方法,兩個對象是相等的,那麼在每個對象上調用hashCode方法必須產生相同的整數結果。
  • 如果兩個對象根據equals(java.lang.Object)方法是不相等的,那麼不一定在每個對象上調用hashCode方法必須產生不同的整數結果。但是,程序員應該意識到,爲不相等的對象生成不同的整數結果可能會提高哈希表的性能。
    在合理的實踐範圍內,類對象定義的hashCode方法爲不同的對象返回不同的整數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章