从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)
推荐阅读
- 毕业是条分叉路口,从此我们相忘于江湖
- 从旧金山到上海, HTTP/3 非常快!
- 钻石价格预测的ML全流程!从模型构建调优道部署应用!?
- Opencv图像操作
- AI识万物(从0搭建和部署手语识别系统|AI识万物:从0搭建和部署手语识别系统 ?)
- 假如时光倒流十年,你会做什么()
- 想到,做到,很重要
- 投稿|对话《经济观察报》副总编辑郭宏超:媒体环境发生巨变,财经内容从业者该如何应对?
- 浅浅,不要忘记我(二)
- 设计模式|深入浅出依赖注入及其在抖音直播中的应用