本體性: 是絕對的,物理意義上的,是判斷物體是不是同一個本體。數組
相等性:是相對的,多數時候是人們根據須要定義的。spa
例如,有2枚一元的硬幣,從本體性上來講,這2枚硬幣是不一樣的,不相等的。可是從實際意義上來講,人們定義他們是相同的。指針
雙等號:本體性判斷,指針是否相同,是否指向同一個內存地址。對象
-isEqual:一般是用來判斷人們定義的相等性。繼承
NSObject中的-isEqual:方法的默認實現是使用的 ==
內存
例如,咱們定義只要兩個對象中的全部屬性相等,咱們就認爲這兩個對象是相等的。這時候咱們就要重寫-isEqual:方法,在裏面判斷兩個對象中的全部屬性是否相等,若是是就返回YES,不是就返回NO。這樣,對比的結果就不是侷限於本體性了。hash
在Foundation中繼承NSObject的一些類中,有時候人們想要相等性的判斷,而不是本體性的判斷,因此Foundation中的一些類中默認實現了相等性的判斷,例如io
聊到-isEqual:方法的時候,一般-hash方法也會被牽扯進來。其實-hash方法不影響-isEqual的判等。table
-hash方法返回的是NSUInteger類型,是根據對象運算獲得的一個數,當對象被加入到NSMutableSet的時候,會調用-hash方法,用於經過映射計算對象在NSMutableSet的位置。若是hash結果能使得對象在NSMutableSet中的分佈儘量均勻,那麼NSMutableSet的查找時間複雜對能夠認爲是O(1)。若是全部的對象的-hash方法返回同一個數,那麼全部的對象在散列表中所有衝突,無論是拉鍊仍是尋址,時間複雜度都會退化成數組的O(n)。方法