說實話我原來根本不知道還有這樣一個問題返咱!??
1.isEqual和==有什么區(qū)別?
==判斷兩個對象是否相等就是在判斷兩個對象的內(nèi)存地址是否相等钥庇,內(nèi)存地址不等就認為這兩個對象不想等。
isEqual則不同咖摹,它判斷兩個對象是否想等不僅僅是判斷內(nèi)存地址评姨,就算內(nèi)存地址不同兩個對象也可能被判為相等。
????:
????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實現(xiàn)的萤晴,在這兩個集合類里判斷成員是否相等的時候為了提高速度吐句,先判斷hash值是否想等嗦枢,如果hash值不等那么直接認為兩個成員是不想等的文虏。hash值(hashcode)相等的成員存儲在一個subCollection里面择葡,hash值相等的情況下在這個subCollection里面根據(jù)isEqual的規(guī)則去判斷兩個成員是否相等敏储。
所以,如果兩個對象相同已添,則 hashCode 一定相同滥酥;反之更舞,hashCode 相同的兩個對象缆蝉,并不一定是相同的對象刊头。如果所有對象的 hashCode 都相同原杂,那么每次比較都會調(diào)用 equal 方法穿肄,整個查詢效率會變得很低咸产。