C# GetHashCode、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判斷是否相等
場合:注冊時判斷用戶名是否存在等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM