雙等號、-isEqual:和-hash

本體性和相等性

本體性: 是絕對的,物理意義上的,是判斷物體是不是同一個本體。數組

相等性:是相對的,多數時候是人們根據須要定義的。spa

例如,有2枚一元的硬幣,從本體性上來講,這2枚硬幣是不一樣的,不相等的。可是從實際意義上來講,人們定義他們是相同的。指針

雙等號 vs -isEqual:

雙等號:本體性判斷,指針是否相同,是否指向同一個內存地址。對象

-isEqual:一般是用來判斷人們定義的相等性。繼承


NSObject中的-isEqual:方法的默認實現是使用的 == 
內存

例如,咱們定義只要兩個對象中的全部屬性相等,咱們就認爲這兩個對象是相等的。這時候咱們就要重寫-isEqual:方法,在裏面判斷兩個對象中的全部屬性是否相等,若是是就返回YES,不是就返回NO。這樣,對比的結果就不是侷限於本體性了。hash

在Foundation中繼承NSObject的一些類中,有時候人們想要相等性的判斷,而不是本體性的判斷,因此Foundation中的一些類中默認實現了相等性的判斷,例如io

  • NSAttributedString -isEqualToAttributedString:
  • NSData -isEqualToData:
  • NSDate -isEqualToDate:
  • NSDictionary -isEqualToDictionary:
  • NSHashTable -isEqualToHashTable:
  • NSIndexSet -isEqualToIndexSet:
  • NSNumber -isEqualToNumber:
  • NSOrderedSet -isEqualToOrderedSet:
  • NSSet -isEqualToSet:
  • NSString -isEqualToString:
  • NSTimeZone -isEqualToTimeZone:
  • NSValue -isEqualToValue:


-hash方法

聊到-isEqual:方法的時候,一般-hash方法也會被牽扯進來。其實-hash方法不影響-isEqual的判等。table

-hash方法返回的是NSUInteger類型,是根據對象運算獲得的一個數,當對象被加入到NSMutableSet的時候,會調用-hash方法,用於經過映射計算對象在NSMutableSet的位置。若是hash結果能使得對象在NSMutableSet中的分佈儘量均勻,那麼NSMutableSet的查找時間複雜對能夠認爲是O(1)。若是全部的對象的-hash方法返回同一個數,那麼全部的對象在散列表中所有衝突,無論是拉鍊仍是尋址,時間複雜度都會退化成數組的O(n)。方法

相關文章
相關標籤/搜索