等價關係
數組
自反、對稱、傳遞函數
ADT的等價操做性能
抽象函數AF:內部表示->抽象表示code
基於抽象函數AF定義ADT的等價操做。對象
使用AF定義等價性get
若是AF映射到相同的結果,則等價。hash
使用操做定義等價性class
站在外部觀察者角度,對兩個對象調用任何相同的操做,都會獲得相同的結果則說明等價。效率
== :引用等價性,equals():對象等價性數據類型
自定義ADT時,須要根據對等價的要求,決定是否重寫equals()
==操做和equals()方法
對對象數據類型,採用equals(),對基本數據類型,採用==(判斷ID是否相等,指向同一段空間)
應該老是使用equals()判斷相等,
不變類型的等價性
默認實現是使用了引用等價性
須要重寫
instanceof
判斷某個對象是否是特定類型(或其子類型)
動態類型檢查。除了用於實現equals方法,儘量避免使用instanceof和getclass
用多態性代替instanceof
對象裏的equals()契約
除非對象被修改了,不然調用屢次equals的結果應一致。相等的對象,其hashCode的結果必須一致。
打破了等價關係
自反性,傳遞性(絕對值的例子),對稱性
哈希表
哈希表實現了鍵值之間的映射。鍵值對中的key被映射爲hashcode,對應到數組的index,hashcode決定了數據被存儲到數組的哪一個位置。
哈希表契約
程序中屢次調用同一對象的hashCode方法,都要返回相同值。等價的對象必須有相同的hashCode。不相等的對象hashCode相同性能會變差。
重寫hashCode()
最簡單方法:讓全部對象的hashcode爲一常量:下降了效率。
經過equals計算用到的全部信息的hashcode組合出新的hashcode
觀察等價性(傾向):不改變狀態的狀況下,兩個可變對象看起來一致。
行爲等價性:調用對象的任何方法都展現出一致的結果。
可變類型和不可變類型equals和hashcode的方法總結
後者必須重寫,前者不該該