从containsObject浅谈到对象地址、isEqual和hash值

【从containsObject浅谈到对象地址、isEqual和hash值】近期修正一个上个程序员写的代码bug,用到了containsObject这个方法,这是个数组对象方法,深究了一下,大概有以下几种用法,肯定有似懂非懂的同学,容我来解惑一二。
1、检测数组中是否存在某个字符串

NSString *str1 = @"123"; NSString *str2 = @"345"; NSMutableString *str3 = [NSMutableString stringWithString:@"123"]; NSArray *strArray = @[str1, str2, str3]; NSMutableArray *testStrArray = [NSMutableArray array]; for (int i = 0; i<3; i++) { [testStrArray containsObject:strArray[i]]?:[testStrArray addObject:strArray[i]]; }

2、
LLZLabel *l1 = [[LLZLabel alloc] init]; l1.text = @"llz"; LLZLabel *l2 = [[LLZLabel alloc] init]; l2.text = @"llz"; NSUInteger sss1 = l1.hash; NSLog(@"%zd",sss1); NSUInteger sss2 = l2.hash; NSLog(@"%zd",sss2); NSMutableArray *testStrArray = [NSMutableArray array]; [testStrArray addObject:l1]; BOOL qqq = [testStrArray containsObject:l2]; NSLog(qqq?@"YES":@"NO");

每个对象都有一个hash值,一般来说不同对象就算内容一样,hash值也是不同的。但不同地址的字符串,如果内容一致,那么hash值也是一样的。而isEqual方法和containsObject方法比较的就是两个对象的hash值,通过上面的两个方法打印一下就能得出。(isEqual返回yes的情况说明两个对象的hash值相同,而两个对象的hash值相同并不能推导出isEqual返回yes)

    推荐阅读