一:等價關系
ADT是對資料的抽象,展現為一組對資料的操作。
抽象函數AF:内部表示->抽象表示
ADT上的等價性是基于AF定義的
關系等價性
1.自反
2.對稱
3.傳遞
二:不可變類型的等價性
1.用觀察的方法定義等價性
占在外部觀察者的角度,對兩個對象調用任何相同的操作,得到的結果一樣,則認為兩個對象等價。
例:
分析:外部隻能通過getlength得到資料秒數,故d1、d3、d4等價。
三:= = 和.equals比較
1. = = 比較兩個引用是否指向記憶體中相同的存儲地點,同,則相等。
2. .equals 為自定義ADT是重寫object的euals而來,比較的是兩個對象是否具有等價性
四:實作.equals
分析:d1、d2傳入對象具有等價性,故,true。
d1為Duration類,o2為Objects類,調用參數為Object that版本,使用等于号比較兩者,兩者所處存儲位置不同,故不相等。
一種好的實作方式:
分析:重寫了預設的Object類的.equals方法,首利用instanceof判斷是否為Duration的執行個體,是進行下一步getlength值的判斷。
A instanceof B:雙目運算符,判斷A是否為B的執行個體對象、是否為B的接口實作類、是否為直接子類或間接子類
A為null傳回false
為動态檢查
不應再處.equals方法外使用
五:重寫equals方法的一般約定
1.滿足等價關系
2.多次調用傳回結果相等,除非被修改
3.x.equals(null)傳回值為false
4.相等對象,hashCode( )産生的結果必須一緻
5.重寫equals必須重寫hashCode
重寫Hashcod例子:
六:可變類型的等價性
1.觀察等價性:在不改變狀态情況下,兩個可變類型對象看起來一緻
2.行為等價性:調用對象的任何方法都展示出一緻的結果
3.如果某個mutable的對象包含在Set 集合類中,當其發生改變後,集合類的行為不确定
4.對可變類型,實作行為等價性即可,也就是說,隻有指向同樣記憶體空間的objects,才是相等的。是以對可變類型來說,無需重寫這兩個函數,直接繼承Object的兩個方法即可。如果一定要判斷兩個可變對象看起來是否一緻,最好定義一個新的方法。
5.Clone()in object
七:自動裝箱