JAVA之hashCode方法

HashCode方法的作用

在HashSet中的元素是不能重復的,jvm可以通過equals方法來判斷兩個對象是否相同,假設自定義一個Person類里面有10個成員變量,每調用一次equals方法需要做10次if判斷分別比較這10個成員變量是否相等,如果想HashSet中存放100個對象,那就會做1000次if判斷,數據量大的話會嚴重影響性能。

要解決這個問題的話可以這樣做,將一些特征相似或相近的對象歸類放到一起給他們一個編號,在做equals判斷時,先比較這些編號,編號相同的話再去比較equals,這樣可以減少一些比較次數。這個編號可以通過HashCode方法獲得。HashCode方法的作用就是將對象進行分類,然后獲取到編號值。

舉個例子,圖書館里面的書都是分好類的,想找《java編程思想》這本書,先找到計算機類的書架,然后再去找就行,倘若圖書館里面的書籍沒有分類,那找起來就如大海撈針。

如何重寫HashCode

HashCode算法決定了對象的歸類,如果算法編寫的不好可能不會對性能有所提升。在編寫時最好可以讓對象均勻的散列開,這里假設可以將對象分為10個種類,那么每個種類中存放的對象的數量最好不要相差太多。

這里以Person類為例:

將Person的name和age屬性都加上了,可以將Person進行細分,開發中建議使用:

為什么上面的prime的值是31?其實這個值改成別的也可以,只不過定義為31之后有一些好處:

31是一個質數,質數是能被1和自己本身整除的數,并且這個數不大也不小

31這個數好算,2的五次方-1,2向左移動5位

關于重寫HashCode方法的一些說明

任何時候對同一對象多次調用 hashCode 方法,都必須一直返回同樣的整數。

如果兩個對象通過 equals(Object) 方法來比較相等,那么這兩個對象的 hashCode的值必須相等。

如果兩個對象通過 equals(Object) 方法比較結果不等,可以相等也可以不相等。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。