讀書筆記effective之對所有物件通用的方法

2021-08-26 18:57:02 字數 1777 閱讀 2693

讀書筆記effective之對所有物件通用的方法

第一條 覆蓋equals時遵守通用約定

覆蓋equals方法似乎很簡單,但是許多覆蓋方式會導致錯誤,並且後果非常嚴重,如果滿

足下面任何乙個條件就是所期望的結果

類的每個例項本質上都是唯一的

不關心類是否提供了「邏輯相等」的測試功能

超類已經覆蓋了equals,從超類繼承過來的行為對於子類也是合適的

類是私有的的或是包機私有的,可以確定它的equals方法永遠不會被呼叫

要覆蓋equals 需要遵守的約定

自反性:對於任何非null的引用值x,x.equals(x)必須返回true

對稱性:對於任何非null 引用值x和y,當且僅當y.equals(x)返回true,並且y.equals.

(x)也必須返回true.

傳遞性:對於任何非null的引用值x,y和z,如果x.equals(y)返回true,並且y.equals(z)

也返回true,那麼x.equals(z)也必須返回true,

看乙個簡單的不可變得二維整數point類

public  class point

public boolean equals(object o)

}

假設你想要擴充套件這個類,為乙個點新增顏色資訊

public  class colorpoint extends

public colorpoint(int x,int y,color color)

public boolean equals(object o)

}

上面的例項在比較相反時可能得到不同的結果

point p=new point(1,2);

colorpoint cp=new colorpoint(1,2,color.red) ;

p.equals(cp)返回true ,而cp.equals(p)返回false, 這主要是引數型別不正確,子

類和父類的equals的內部不一樣。一種解法是父類為abstract 型別,子類新增新的元件,就

不會違背equasl約定。

一致性:對於非null的引用值x和y,只要equals的比較操作在物件中所用的資訊沒有被修

改,多次呼叫x.quals(y)就會一直返回true,或者一種地返回false

對於任何非null的引用值x,x.equals(null)必須返回null

實現equals方法的技巧

1 使用==操作符檢查「引數是否為這個物件的引用」

2 使用instanceof操作符檢查"引數是否為正確的型別"

3 把引數轉換成正確型別

4 對於該類中的每個「關鍵」域,檢查引數中的域是否與該物件中對應的域相配備

第二條 覆蓋equals時總要覆蓋hashcode

在應用程式的執行期間,只要物件的equals方法的比較操作所用到的資訊沒有被修改,那麼對這同一隊形呼叫多次,hashcode 方法都必須始終如一地返回同一整數。在同乙個應用程式的多次執行過程中,每次執行所返回的整數可以不一致。

如果兩個物件根據equals(object)方法比較是相等的,那麼呼叫這兩個物件中任意乙個物件的hashcode方法都必須產生同樣的結果

如果兩個物件根據equals(object)方法比較是不相等的,那麼呼叫這兩個物件中的任意乙個物件的hashcode 方法,則不一定產生不同的整數結果。但是程式設計師應該知道,給不相等的物件產生截然不同的整數結果,有可能提高雜湊函式的效能。

讀書筆記 之五

筆者的話 接觸硬體較少,很多術語都是字面翻譯,讀者請見諒.我盡量帶上英文原詞,避免歧義.2.2 磁碟驅動器元件 磁碟驅動器使用快速移動的臂來在大唱片一樣的覆蓋著小磁粒的碟片上讀寫資料的.資料從磁碟片上通過r w頭傳輸到計算機中.多個碟片,讀寫頭和控制器被組合在一起,通常這被稱為是硬碟驅動器 hard...

讀書筆記之TCP UDP

網際網路,更一般的是tcp ip網路為應用程式提供兩個運輸層協議,即udp和tcp。當乙個軟體開發者為英特網建立乙個新的應用時,首先要做出的決定就是,選擇使用tcp協議還是udp協議。每個協議為呼叫他們的應用程式提供了不同的服務集合。tcp服務模型包括面向連線服務和可靠資料傳輸服務。當某個應用程式呼...

讀書筆記之C delegate

c 的使用主要在 需要將乙個方法當做引數傳遞到另乙個方法時。比如啟動乙個執行緒執行任務,而這個執行緒要執行的方法可以通過 傳遞過來。包括乙個方法或者多個方法的位址和c 的函式指標很相似,但它是型別安全的。1.宣告 delegate void intmethodinvoker int x 這個 可以引...