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值得成员, 此时再按照数组方式进行查找
网友评论