自己寫的類,一般要實現哪些方法?
- equals, hashCode, toString, clone,finalize, 此外還有Comparable.compareTo方法
什么時候不用實現equals方法?
- 類的每個實例本來就是唯一的
- 該類不需要提供logical equality的測試
- 超類已經覆蓋了equals方法,超類的行為適合于該類
- 該類是私有或包私有,你確定該類的equals方法不會被invoked
覆蓋equals方法遵循的5條協議是哪些?
- 反身性;對稱性;傳遞性;一致性;Non-nullity
有什么辦法對一個可實例化的類進行extend,并添加一個value component,同時保護equals協議?
- 沒辦法
針對上一條的問題,能不能換個角度解決該問題?
- 改用組合,而不用繼承
- 可以利用類層次,即在抽象類的子類中添加value component,同時保護equals協議
覆蓋equals方法,有什么建議?
- 當你必須要覆蓋equals方法時,再去覆蓋它
- 覆蓋equals方法,要遵循上述5條協議
為什么當你覆蓋equals方法時,總是要覆蓋hashCode方法?
- 覆蓋hashCode的通用協議:
1.假如equals方法沒被修改,在一個應用的執行中,重復多次調用hashCode方法,必須返回相同的值
2.equal objects must have equal hash codes
3.不equal objects,不要求hash codes不同
- 根據覆蓋hashCode第2條通用協議,等值對象必須具有相等的hash codes,兩個等值對象如果不覆蓋hash codes,則其hash codes值不等,違反了該協議。所以覆蓋equals方法時,必須要覆蓋hashCode方法。
為什么總是要覆蓋toString方法
- 原始的toString返回的字符串是:類名+@+十六進制的hashCode值
- toString方法的協議:返回精簡,且人易讀的字符串
覆蓋clone方法,有哪些建議?
- 盡量不要實現Cloneable接口,不要提供 clone方法
- 對于數組的copy,建議使用clone方法
- immutable classes 應該禁止提供clone方法
- 對于object copy,推薦使用 copy constructor 或者 copy factory
依賴comparison的類有哪些?
- TreeSet,TreeMap,Collections,Arrays,包含搜索和排序算法
一個類實現comparison的功能,有哪些方法?
- 實現Comparable接口,重寫compareTo方法
- 使用Comparator
- java8中Comparator接口中的comparingInt和comparing等方法
實現compareTo方法時,需要注意什么?
- 不要使用>和<以及 - 符號,要使用包裝的原始類型類中的compare方法或使用Comparator接口中的構造方法。