假设我有一个包含字符串的 NSSet
,如果我使用另一个字符串发送 containsObject:
,这个字符串指针与原字符串相比不同但值相同,那么它会返回 YES
吗?
同样的,当涉及到 removeObject:
时,情况是否相同?也就是说,不同的对象具有不同的指针但具有相同的字符串值将导致移除吗?
假设我有一个包含字符串的 NSSet
,如果我使用另一个字符串发送 containsObject:
,这个字符串指针与原字符串相比不同但值相同,那么它会返回 YES
吗?
同样的,当涉及到 removeObject:
时,情况是否相同?也就是说,不同的对象具有不同的指针但具有相同的字符串值将导致移除吗?
-containsObject:
使用 -isEqual:
(和 -hash
)进行相等性测试。这同样适用于 -removeObject:
以及 NSSet
中依赖一些相等性概念的任何其他操作。
-[NSSet member:]
的文档说明它使用了 isEqual:
; member
是 基本的集合方法 之一,并且似乎隐含着(尽管不是明确地)containsObject:
使用 member
. - jscsNSSet
是一个哈希表。-[NSMutableString hash]
取决于字符串的内容。当字符串在集合中时,如果对其进行更改,则会显式地不受支持(与在NSDictionary
中更改它相同),因为这会更改哈希值,从而导致查找失败。但是,set.allObjects
生成一个不使用hash
的NSArray
。 - Lily BallardNSMutableString
具有相同的哈希值,这将在存储在字典/集合中时产生绝对糟糕的性能。简单的规则是,您不应该改变已放入NSSet
或用作NSDictionary
键的对象。 - Lily BallardNSSet
实际上是一个没有值的 NSDictionary
,这是正确的。但是,NSArray
与仅包含值的 NSDictionary
完全不同(除了所有性能差异之外,NSDictionary
是未排序的,而 NSArray
是排序的)。 - Lily Ballard