== isEqual,isEqualToString 三者的区

2019-11-13  本文已影响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协议里定义

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方法内部实现

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

上一篇 下一篇

猜你喜欢

热点阅读