参考:isEqual & hash
参考:iOS开发 之 不要告诉我你真的懂isEqual与hash!
如何判断对象是否相等
对于基本类型, ==运算符比较的是值; 对于对象类型, ==运算符比较的是对象的地址(即是否为同一对象)
如下例子:
UIColor *color1 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
UIColor *color2 = [UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0];
NSLog(@"color1 == color2 = %@", color1 == color2 ? @"YES" : @"NO");
NSLog(@"[color1 isEqual:color2] = %@", [color1 isEqual:color2] ? @"YES" : @"NO");
color1 == color2 = NO
[color1 isEqual:color2] = YES
而对于对象判断是否相等需要使用** isEqual**方法,该方法不自定义重写则判断是否地址相同,如果自定义重写则判断自定义的条件是否相等;
hash与isEqual对象过滤
@implementation Person
- (instancetype)initWithName:(NSString *)name age:(int)age
{
self = [super init];
if (self) {
_name = name;
_age = age;
}
return self;
}
-(BOOL)isEqual:(Person *)object{
NSLog(@"I'm here:isEqual");
if (!object) {
return NO;
}
if ([self.name isEqual:object.name] && (self.age == object.age)) {
return YES;
}
return NO;
}
- (NSUInteger)hash{
NSUInteger hash = [super hash];
NSLog(@"I'm here:hash%ld",hash);
return hash;
}
@end
测试代码:
Person *person1 = [[Person alloc] initWithName:@"张三" age:10];
Person *person2 = [[Person alloc] initWithName:@"李四" age:10];
Person *person3 = [[Person alloc] initWithName:@"李四" age:10];
NSMutableSet *mSet = [NSMutableSet set];
[mSet addObject:person1];
[mSet addObject:person2];
[mSet addObject:person3];
NSLog(@"mSet.count:%ld",mSet.count);
每次mSet 执行addObject时都会优先获取hash值,
- (1)如果hash值与hash表中都不同,则添加到mSet中;
- (2)如果与其中相同,则作为参数再与相同的hash的对象执行isEqual方法。如果执行的结果为YES则放弃,如果不同,则继续(2) 过程,如果遍历的(2)过程都不同,则添加到mSet中。
网友评论