字符串相等
- (void)testStringEqual {
NSString *stringA = @"stringA";
NSString *stringB = [NSString stringWithFormat:@"stringA"];
//字符串不可以直接使用 == 来判断
if (stringA == stringB) {
NSLog(@"字符串stringA == 字符串stringB");
}
//isEqual string 本身就是对象类型,可以使用NSObjct的方法
BOOL equal1 = [stringA isEqual:stringB];
NSLog(@"stringA 和stringB 相等:%d",equal1);
// isEqualToString 对于string类型来说使用 isEqualToString 比 isEqual 更高效
BOOL equal2 = [stringA isEqualToString:stringB];
NSLog(@"stringA 和stringB 相等:%d",equal2);
}
IndexPath相等
/*
2022-10-18 13:54:49.120806+0800 compareObject[76481:10481317] 1indexPath1 == indexPath2
2022-10-18 13:54:49.120869+0800 compareObject[76481:10481317] 2indexPath1 == indexPath2
2022-10-18 13:54:49.120911+0800 compareObject[76481:10481317] indexPath1 和 indexPath2 是相等的
*/
//对于indexPath 来说,相同的row 和 inSection 生成的indexPath 对象地址是一样的,
//因此对于indexPath 来说可以有三种判断相等的方法, 1. == (因为地址一样,就是同一个对象) 2.isEqual: 主要是判断的是对象的hash值 3. compare 这个是 indexPath特有的,返回的结果是NSComparisonResult 对象.
- (void)testIndexPath {
NSIndexPath *indexPath1 = [NSIndexPath indexPathForRow:1 inSection:2];
NSIndexPath *indexPath2 = [NSIndexPath indexPathForItem:1 inSection:2];
if(indexPath1 == indexPath2) {
NSLog(@"1indexPath1 == indexPath2");
}
if ([indexPath1 isEqual:indexPath2]) {
NSLog(@"2indexPath1 == indexPath2");
}
NSComparisonResult result = [indexPath1 compare:indexPath2];
if (result == NSOrderedSame) {
NSLog(@"indexPath1 和 indexPath2 是相等的");
}
}
Array 比较是否相等
//输出 数组用isEqualToArray判断是相同的, 因为数组中的字符串是相等的.
- (void)testArray {
NSString *stringA = @"stringA";
NSString *stringB = [NSString stringWithFormat:@"stringA"];
NSArray *arrayA = @[stringA, @"2",@"3"];
NSMutableArray *tempArray = [NSMutableArray array];
[tempArray addObject:stringB];
[tempArray addObject:@"2"];
[tempArray addObject:@"3"];
NSArray *arrayB = [tempArray copy];
BOOL equalArray = [arrayA isEqualToArray:arrayB];
if (equalArray) {
NSLog(@"数组用isEqualToArray判断是相同的");
}
}
//输出结果是不相等的,因为数组还是逐个比较对象里面的hash值,hash值就是对象是同一个.
- (void)testArray2 {
Person *person1 = [Person new];
person1.name = @"name";
person1.age = 24;
Person *person2 = [Person new];
person2.name = @"name";
person2.age = 24;
NSArray *array1 = @[person1];
NSArray *array2 = @[person2];
BOOL equalArray = [array1 isEqualToArray:array2];
if (equalArray) {
NSLog(@"数组用isEqualToArray判断是相同的");
}else {
NSLog(@"数组用isEqualToArray判断是不相等的");
}
}
对象是否相等
//对于对象类型来说,NSObject 主要是针对地址来说,即便是你创建一个 Person 对象,Person的属性完全相同,这时用isEqual 也是不相等的.
- (void)testObject {
NSObject *objet1 = [NSObject new];
NSObject *object2 = [NSObject new];
//不会打印输出的
if ([objet1 isEqual:object2]) {
NSLog(@"objet1 和 object2 两个对象相等");
}
}
总结
isEqual 本质是比较指针是否相等,方式是使用hash值进行判断.和 == 没差别,不过 == 还可以用于数值的判断.
-
string 使用isEqualToString和isEqual均可以,isEqualToString 对于string类型来说使用 isEqualToString 比 isEqual 更高效,优先采用 isEqualToString。
-
对于Array
isEqualToArray主要是对数组的元素进行 isEqual 进行判断,不判断数组本身的地址是否一致。 -
于NSIndexPath 来说可以有三种判断相等的方法. 1. == (因为地址一样,就是同一个对象) 2.isEqual: 主要是判断的是对象的hash值 3. compare 这个是 indexPath特有的,返回的结果是NSComparisonResult 对象. 还有一些子类重写了isEqual 的方法。
NSAttributedString -isEqualToAttributedString:
NSData -isEqualToData:
NSDate -isEqualToDate:
NSDictionary -isEqualToDictionary:
NSHashTable -isEqualToHashTable:
NSIndexSet -isEqualToIndexSet:
NSNumber -isEqualToNumber:
NSOrderedSet -isEqualToOrderedSet:
NSSet -isEqualToSet:
NSString -isEqualToString:
NSTimeZone -isEqualToTimeZone:
NSValue -isEqualToValue: