美文网首页iOS开发
Objective-C 判断对象是否相等

Objective-C 判断对象是否相等

作者: Pandakingli | 来源:发表于2017-12-16 20:43 被阅读22次

对象是否相等

        NSString *str1 = [[NSString alloc] initWithCString:"equal" encoding:NSUTF8StringEncoding];
        NSString *str2 = @"equal";
        if(str1 == str2)
        {
            NSLog(@"equal");
        }

直接比较两个对象是否相等,实际上比较的是两个对象的指针是否相等。
上述代码中str1和str2是分别指向两块不同的内存的,所以不相等。

   NSString *str1 = [[NSString alloc] initWithCString:"equal" encoding:NSUTF8StringEncoding];
        NSString *str2 = @"equal";
        if([str1 isEqual:str2])
        {
            NSLog(@"equal");
        }

改用NSObject提供的isEqual方法比较,发现"equal"打印了出来。
isEqual在NSString 内部被实现的时候比较的是真正的字符串是否相等.

#import <Foundation/Foundation.h>
@interface EObject : NSObject
@property(nonatomic ,strong)NSString *name;
@end

#import "EObject.h"
@implementation EObject
@end

EObject类,有一个name属性。
现在我们创建两个对象来比较一下:

 EObject *object1 = [EObject new];
 EObject *object2 = [EObject new];
        
 if([object1 isEqual:object2])
 {
        NSLog(@"equal");
 }

发现代码运行结束并没有输出"equal",原因就在于isEqual方法是需要我们自己实现的。
NSObject的isEqual:方法默认是比较两个对象指向的地址是否相等,这里开辟了两个对象肯定不相等了。

现在我们添加isEqual:方法的实现:

-(BOOL)isEqual:(id)object
{
    if([self class] == [object class])
    {
        if(![self.name isEqual:[(EObject *)object name]])
        {
            return NO;
        }
        return YES;
    }
    else
    {
        return [super isEqual:object];
    }
}
        EObject *object1 = [EObject new];
        EObject *object2 = [EObject new];
        object1.name = @"xiaoming";
        object2.name = @"xiaoming";
        
        if([object1 isEqual:object2])
        {
            NSLog(@"equal");
        }

发现这时候运行就已经相等了。

为类定制等同性方法

NSString除了可以用isEqual比较是否相等意外,还可以使用isEqualToString来比较.
这是专为NSString类定制的等同性方法,提供这样的方法就可以很明确我们实现了该对象的isEqual方法。
下面为ElObject提供定制的等同性方法,并修改isEqual:方法

- (BOOL)isEqualToEObject:(EqualObject *)object
{
    if(self == object)
        return YES;
    if(![self.name isEqualToString:object.name])
        return NO;
    return YES;
}

- (BOOL)isEqual:(id)object
{
    if([self class] == [object class])
    {
        return [self isEqualToEObject:object];
    }
    else
    {
        return [super isEqual:object];
    }
}

然后客户端修改

        if([object1 isEqualToEqualObject:object2])
        {
            NSLog(@"equal");
        }

对象hash码

每一个OC对象内部都是有一个hash码的,当对象存入集合中(Array,Set,HashTable等),那么他们的hash码会被当做键来决定他们该放入哪一个集合中。
首先我们先看一下集合内部是如何存储的

hashCode subCollection
code1 value1,value2,value3,value4
code2 value5,value6
code3 value7
code4 value8,value9,value10

集合的内部并不像我们所想的那样,是一个hash表,它将插入的对象根据hashCode来决定放入哪一个子集合。如果要删除或者比较集合内元素,它首先根据hashCode找到子集合,然后跟子集合的每个元素比较。
所以如果我们的对象的hashCode如果都相同,那么就会出现严重的效率问题,
理论上来说,我们确定等同性的两个对象的hash应该是相同的而不等的两个对象hash也应该不等,这样在存入hashTable之类的集合时,就会避免相同对象的重复添加,比如我们两个对象hash相等,但实际对象不等,那么添加的时候就会被添加到同一subCollection下面。
所以为了避免这种情况,我们尽量自己实现一种避免重复的方式,
这里提供一种,添加一个新属性age,hash实现如下:

- (NSUInteger)hash
{
    NSUInteger nameHash = [_name hash];
    NSUInteger ageHash = _age;
    return nameHash ^ ageHash;
}

集合中的对象等同性

我们对NSArray调用isEqual方法,它会对集合里的每个对象和另一个集合相同位置的对象进行isEqual:操作,只有全部相等,两个集合才相等。
这里说一下,集合里面最后添加都是不可变元素,如果是可变性元素会出现无法控制的情况。
比如我们往NSSet里面添加两个NSMutableArray,一开始两个array不等,那么set中就有两个元素。
然后修改一个array使两个相等,这是set中就会有两个相等的元素存在。

相关文章

  • python 高级编程①

    1 ‘==’ 与‘is ’的使用 ① ‘==’判断两个对象内容是否相等 ‘is’判断两个对象的地址是否相等 ②在p...

  • kotlin学习笔记

    $ ?表示对象可能为空 ?: !! ==,=== ==判断值是否相等,===判断值及引用是否完全相等。 ..Kot...

  • Objective-C 判断对象是否相等

    对象是否相等 直接比较两个对象是否相等,实际上比较的是两个对象的指针是否相等。上述代码中str1和str2是分别指...

  • 关于isEqual

    isEqual,用来判断两个对象是否相等。但是,与“==”判断指针地址是否相等,不同的是,它判断的是对象的内容方...

  • C# 相等比较

    引用相等性 判断两个对象是否引用同一基础对象。使用 ReferenceEquals 方法判断: 值相等性 使用 =...

  • JS如何判断俩个对象是否相等

    判断对象相等的步骤:1.先判断俩者是不是对象2.是对象后俩者长度是否一致3.判断俩个对象的所有key值是否相等相同...

  • Java中判断两个对象相等,重写equals()方法和hashC

    基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法:判断对象引用所指向的对象地址是否相等 对象...

  • JS 判断两个对象是否相等

    判断两个对象是否相等,执行结果:

  • js 工具函数

    imeWeb.tools = { }/* 判断对象是否相等 */imeWeb.isObjectValueEqual...

  • Python is 与 == 的区别

    打印结果 is是用于判断 a b 是否指向同一个对象==是用于判断 a b 的值是否相等

网友评论

    本文标题:Objective-C 判断对象是否相等

    本文链接:https://www.haomeiwen.com/subject/qslewxtx.html