參考資料:html
http://blog.csdn.net/afgasdg/article/details/6889383算法
http://www.cnblogs.com/skyivben/archive/2010/04/18/1714933.html數據庫
http://www.cnblogs.com/sutengcn/archive/2007/03/16/677206.htmlspa
Equals:邏輯上判斷對象是否相等(默認的objec是判讀引用地址是否相同,若是重載後是判讀對象是否相同).net
ReferenceEquals:判斷對象是否指向統一引用地址(等於==)code
GetHashCode:CLR 5.4htm
對於一個值類型,若是其自己存在某個數據能夠惟一標明此類型對象,有點兒像數據庫中的Key字段,那麼用它做爲類型的第一個元素對象
計算類型實例的哈希碼應該遵照的規則「blog
1)算法至少一個實例字段字符串
2)理想狀況下算法中使用的字段應該是不可變的,也就說,字段應在對象構造時初始化,在對象什麼期內永不改變。
3)包含相同值的不一樣對象應返回相同的哈希碼。
System.Object實現的GetHashCode方法對其派生類型以及類型中的字段一無所知。所以利用Object的GetHashCode方法返回的編號,能夠在AppDomain中惟一性地標識對象。(實際上是調用底層的RuntimeHelper類提供了一個公共的靜態方法GetHashCode,它獲取對一個Object的引用做爲參數。)
這個編號保證在對象生存期內不會改變。但在對象被垃圾回收以後,它的惟一性的編號可能被從新用做一個新對象的哈希碼。
總結:
一、equals方法用於比較對象的內容是否相等(覆蓋之後)
二、hashcode方法只有在集合中用到
三、當覆蓋了equals方法時,比較對象是否相等將經過覆蓋後的equals方法進行比較(判斷對象的內容是否相等)。
四、將對象放入到集合中時,首先判斷要放入對象的hashcode值與集合中的任意一個元素的hashcode值是否相等,若是不相等直接將該對象放入集合中。若是hashcode值相等,而後再經過equals方法判斷要放入對象與集合中的任意一個對象是否相等,若是equals判斷不相等,直接將該元素放入到集合中,不然不放入。
五、將元素放入集合的流程圖:
hash衝突:兩個對象相等,hashcode也應該相等。可是兩個對象不等,hashcode也有可能相等。當對象不相等可是hashcode相等的時候,就叫作hash衝突。
Finalize:
GetType:
MemberwiseClone:
ToString:
String.IsInterned:字符串駐留