isEqual,isEqualToString,== 三者的区别

isEqual: 判断两个对象的等同性,首先判断两个对象的地址是否相同,再判断类型是否一致, 然后再判断对象的具体内容是否一致

isEqualToString: 直接判断字符串内容是否相等

==: 对于基本数据类型, ==运算符比较的是值; 对于对象类型, ==运算符比较的是对象的地址是否相同

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...

        NSString *foo = @"Jerry 666";
        NSString *bar = [NSString stringWithFormat:@"Jerry %i", 666];

        BOOL equalA = (foo == bar);
        NSLog(@"equalA = %zd", equalA); // 0 NO

        BOOL equalB = [foo isEqual:bar];
        NSLog(@"equalB = %zd", equalB); // 1 YES

        // 传递给该方法的对象必须是NSString, 否则结果返回undefined
        // isEqualToString的效率要高于isEqual,因为isEqual需要执行额外的步骤去判断,它不知道对象的类型
        BOOL equalC = [foo isEqualToString:bar];
        NSLog(@"equalC = %zd", equalC); // 1 YES

    }
    return 0;
}

isEqual和hash属于NSObject协议里定义

  • (BOOL)isEqual:(id)object;
  • @property (readonly) NSUInteger hash;

isEqual方法内部实现

苹果官方重写isEqual 的demo

- (BOOL)isEqual:(id)other {
    if (other == self)
        return YES;
    if (!other || ![other isKindOfClass:[self class]])
        return NO;
    return [self isEqualToWidget:other];
}

- (BOOL)isEqualToWidget:(MyWidget *)aWidget {
    if (self == aWidget)
        return YES;
    if (![(id)[self name] isEqual:[aWidget name]])
        return NO;
    if (![[self data] isEqualToData:[aWidget data]])
        return NO;  
    return YES;  
}

首先,直接判断两个对象的内存地址是否相等,若相等,则其均指向同一个对象
接下来,比较两个对象的类型,若不属于同一类型,则两对象不相等
最后,检查对象的每一个属性是否相等,只要其中有不相等的属性,则两个对象不相等

hash方法内部实现

如果isEqual方法判定两个对象相等,那么其hash方法也必须返回同一个值
如果两个对象的hash值相等,那么isEqual方法不一定会认为两者相等

为了提高查找的速度, Hash Table出现了,当成员被加入到Hash Table中时, 会给它分配一个hash值, 以标识该成员在集合中的位置
通过这个位置标识可以将查找的时间缩短

和数组相比, 基于hash值索引的Hash Table查找某个成员的过程就是
1: 通过hash值直接找到查找目标的位置
2: 如果目标位置上有多个相同hash值得成员, 此时再按照数组方式进行查找

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值