说实话我原来根本不知道还有这样一个问题!😖
1.isEqual和==有什么区别
==判断两个对象是否相等就是在判断两个对象的内存地址是否相等,内存地址不等就认为这两个对象不想等。
isEqual则不同,它判断两个对象是否想等不仅仅是判断内存地址,就算内存地址不同两个对象也可能被判为相等。
🙋🌰:
UIColor* color1 = [UIColor colorWithCGColor:[UIColor redColor].CGColor];
UIColor* color2 = [UIColor colorWithCGColor:[UIColor redColor].CGColor];
NSLog(@"%p",color1);
NSLog(@"%p",color2);
if (color1 == color2) {
NSLog(@"==");不会打印
}
if ([color1 isEqual:color2]) {
NSLog(@"isEqual");会打印
}
2.hashcode
NSSet和NSDictionary都是机遇hash table实现的,在这两个集合类里判断成员是否相等的时候为了提高速度,先判断hash值是否想等,如果hash值不等那么直接认为两个成员是不想等的。hash值(hashcode)相等的成员存储在一个subCollection里面,hash值相等的情况下在这个subCollection里面根据isEqual的规则去判断两个成员是否相等。
所以,如果两个对象相同,则 hashCode 一定相同;反之,hashCode 相同的两个对象,并不一定是相同的对象。如果所有对象的 hashCode 都相同,那么每次比较都会调用 equal 方法,整个查询效率会变得很低。