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) 方法比較結果不等,可以相等也可以不相等。