美文网首页
hash与isEqual对象过滤

hash与isEqual对象过滤

作者: lltree | 来源:发表于2018-06-26 14:11 被阅读15次

参考: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对象过滤

请阅读参考:isEqual & hash

@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中。

相关文章

  • hash与isEqual对象过滤

    参考:isEqual & hash参考:iOS开发 之 不要告诉我你真的懂isEqual与hash! 如何判断对象...

  • iOS补充知识

    1、Hash方法与isEqual 1.1、== 运算符判断对象内存地址是否相同 1.2、isequal判断对象是否...

  • iOS 对象判断相等

    == isEqual 重写isEqual 为什么需要重写对象的hash值 参考

  • isEqual和直接使用==

    isEqual 会过滤掉nil对象的比较,且只能进行对象比较

  • iOS中isEqual和Hash的笔记(一)

    iOS中isEqual和Hash的笔记(一) iOS中isEqual和Hash的笔记(一)

  • isEqual与hash

    说实话我原来根本不知道还有这样一个问题!? 1.isEqual和==有什么区别 ==判断两个对象是否相等就是在判断...

  • (八) [OC高效系列]理解对象等同性

    1.对象等同性约定 2.isEqual的正确书写方式 以如下类为例: isEqual的正确书写方式 3.hash值...

  • 相等性

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • 对象相等性isEqual

    当你要实现相等性的时候记住这个约定:你需要同时实现isEqual 和 hash方法。如果两个对象是被isEqual...

  • iOS isEqual与hash!

    详情:https://www.jianshu.com/p/915356e280fc ==运算符只是简单地判断是否是...

网友评论

      本文标题:hash与isEqual对象过滤

      本文链接:https://www.haomeiwen.com/subject/vqvpyftx.html