假設我有一個名爲Person
的對象,它具有屬性socialSecurityNumber
,並且此類重寫isEqual:
方法以在社會安全號碼屬性相等時返回true。並說我已經將一堆Person
的實例放入NSDictionary
。NSDictionary的objectForKey:依賴於身份還是相等?
如果我現在實例化一個newPerson
對象恰好具有相同的社會安全號碼作爲一個已經在字典中,和我做[myDictionary objectForKey:newPerson]
,將它使用isEqual:
並返回YES,還是會比較指針並返回NO?
我知道我可以寫一個簡單的測試來找出,但我想了解objectForKey:
究竟如何認定在字典中的比賽,一般是如何保持一致,這是跨越可可(即不NSArray
的indexofObject:
工作一樣嗎? )
如何實現散列? –
就像你喜歡的那樣,只要2個相同的哈希表具有相同的哈希值,並且哈希值不太複雜就無法計算。用於此的算法取決於您,但具有不同散列值的兩個對象將始終被視爲不同,並且具有相同散列值的兩個對象將被視爲可能相等,並將調用「isEqual:」以確保它們確實是平等的。這樣只通過比較散列值(只是整數)就可以非常快地進行比較和字典查找,並且只有當散列值相等時才與「isEqual:」進行實際比較。 – AliSoftware
例如,對於字符串,可以通過返回字符串的長度來實現'hash'方法。兩個相等的字符串將具有相同的散列值,而2個不同的字符串將具有不同的散列值。一些不同的字符串(比如'@「bar」'和'@「baz」')仍然具有相同的散列值,但這不是問題,在這種情況下,'isEqual:'將會生成更深的分析字符字符來檢查平等。但是這種比較耗時的比較只能用來比較相同長度的字符串:不同長度的字符串會更快地返回「NO」。 – AliSoftware