美文网首页
== isEqual,isEqualToString 三者的区

== isEqual,isEqualToString 三者的区

作者: 希罒 | 来源:发表于2019-11-13 17:47 被阅读0次
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值得成员, 此时再按照数组方式进行查找

相关文章

网友评论

      本文标题:== isEqual,isEqualToString 三者的区

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