1. 程式人生 > >為什麼重寫就一定需要重寫HashCode方法

為什麼重寫就一定需要重寫HashCode方法

    Equals 和 HashCode方法是屬於Object的,所以每個物件都有自己的equals 和 HashCode方法。在Object中equals方法是用來判斷兩個物件是否是同一個也就是他們的儲存地址是一樣的。但是往往我們有自己的需要定義equal,所以重寫Equals方法很重要!下面來說說equals 和 hashcode的不同。

    1. object1.equals (object2)等於true時,hashCode (object1)== hashCode(object2) 一定返回true.

    2. hashCode (object1)== hashCode(object2) f返回false, object1.equals (object2)y 一定等於false

    如果不重寫equals,那麼比較的將是物件的引用是否指向同一塊記憶體地址,重寫之後目的是為了比較兩個物件的value值是否相等。特別指出利用equals比較八大包裝物件
(如int,float等)和String類(因為該類已重寫了equals和hashcode方法)物件時,預設比較的是值,在比較其它自定義物件時都是比較的引用地址hashcode是用於雜湊資料的快速存取如利用HashSet/HashMap/Hashtable類來儲存資料時,都是根據儲存物件的hashcode值來進行判斷是否相同的

    這樣如果我們對一個物件重寫了euqals,意思是隻要物件的成員變數值都相等那麼euqals就等於true,但不重寫hashcode,那麼我們再new一個新的物件,當原物件.equals(新物件)等於true時,兩者的hashcode卻是不一樣的,由此將產生了理解的不一致,如在儲存雜湊集合時(如Set類),將會儲存了兩個值一樣的物件,導致混淆,因此,就也需要重寫hashcode()

    同時還有一個重要的原因,我們都知道hash衝突是怎麼解決的,用散列表!如果兩個物件對應的hashCode相同,那麼衝突的物件自然是放在後面的連結串列上面。著也就是說明兩個物件的hashCode 相同並不代表兩個物件是相等的,但是兩個物件相同他們的hashCode值一定是相同的。