C# GetHashCode、Equals函數和鍵值對集合的關係 說明 HashCode:Hash碼。特性:兩個值,相同的的值生成的Hash肯定相同,但是不同的值生成的Hash很大程式上會不同。作用:求Hash值效率比引用類型判斷是否相等的函數Equals更快,所以被用來輔助判斷鍵值對集合的鍵值是否 ...
C# GetHashCode、Equals函數和鍵值對集合的關係
說明
HashCode:Hash碼。
特性:兩個值,相同的的值生成的Hash肯定相同,Hash不同的值肯定不同。
下麵一張圖中,只有和“錯號”一行或一列的才有意義。
作用:求Hash值效率比引用類型判斷是否相等的函數Equals更快,所以被用來輔助判斷鍵值對集合的鍵值是否已經存在。
說明:Equals和GetHashCode都是object的虛方法,可以被任意類型進行重寫。Equals來判斷兩個值是否相等時用到了反射所以慢一點。
在鍵值對集合如HashTable中,添加鍵值對時,會分兩步檢驗鍵值是否已經存在:第一步檢查所添加的鍵的Hash值是否存在,不存在則直接添加;如果已經存在的話開始第二步,開始檢查鍵是否存在Equals。
namespace JustTest { class Program { static void Main(string[] args) { var t = new Hashtable(); t.Add(new user { }, 1); t.Add(new user { }, 2); } } class user { public override int GetHashCode() { Console.WriteLine("GetHashCode校驗"); return 1; } public override bool Equals(object o) { Console.WriteLine("Equals校驗"); return base.Equals(o); } } }
啟示
可以進行代碼優化:判斷對象(或者字元串)是否存在時常常看到直接Equals的,但是更好的做法就是先判斷兩個值的hashcode是否相等,不相等的話直接添加就好了,如果相等的話然後再Equals判斷是否相等
場合:註冊時判斷用戶名是否存在等。