六,避免使用終結(finalizer)函數
原因:終結函數通常是不可預測的,一般情況下不要使用,使用的結果會帶來很多問題,不穩定,性能差,移植問題等等。
分析原因:
1,從一個對象不可到達到它的終結函數被執行,這段時間是任意的,不確定的,所以時間關鍵的系統不應該使用終結函數。
2,及時的執行終結函數是垃圾回收算法決定的,這種算法在不同的JVM實現中會大相徑庭,使用終結函數的結果就是導致移植性問題
3,如果執行終結函數的線程一直低于當前的線程的優先級,很可能造成占用大量內存,極端情況是出現OutOfMemoryError
4,JSL不保證終結函數一定被執行,所以不要依賴終結函數來更新關鍵性的永久狀態,例如數據庫的永久鎖
5,不要相信System.gc()??? System.runFinalization這兩個函數,它們只能提高終結函數的執行機會,并不保證一定執行。唯一保證一定執行的是System.runFinalizersOnExit喝Runtime.runFinalizersONExit()但這兩個方法已經被聲明不建議使用.
6,一個在終結函數中的一場不會打出任何信息
七:在改寫equals方法的時候遵守通用約定
分析:
1,有些情況下不要隨意改寫equals
(1),一個類的每個實例本質上是唯一的,例如Thread
(2),不管新一個類是否提供了“邏輯相等”的測試功能,例如java.util.Random
(3),超類已經改寫了equals,從超類繼承過來的行為對于子類也是適合的 例如Set從AbstractSet繼承了equals
(4),一個類是私有的,或者是包級私有的,并且確定它的equals方法永遠不會被調用
2, 通用的約定
自反性:? 對于任意的引用值x ,x.equals(x)一定為true
對稱性:? 對于任意的引用值x,y? x.equals(y)返回true是 y.equals(x)也一定返回true
傳遞性:對于任意的引用值x,y,z? 如果x.equals(y)返回true?并且y.equals(z)返回true 那么 x.equals(z)也一定是true
一致性:對于任意的x,y如果x,y沒有被更改,調用任意多次x.equals(y)返回的結果應該一樣。
非空性:對任意的引用x ,x.equals(null)一定返回false
3不要將equals聲明中的Object對象換成別的類型
4,不要讓equals方法依賴不可靠資源