面试小结_20171030

  1. 下面代码打印 true 还是 false

    id arr = [[NSArray alloc] init];
    if ([[arr class] isKindOfClass:[NSArray class]]) {
        NSLog(@"true");
    } else {
        NSLog(@"false");
    }
    

    答案:
    打印 false

    面试小结_20171030_第1张图片
    1.jpeg

    分析:
    因为 NSArray 运用了类蔟 (Class clusters) 的设计模式,类簇其实是对现实的一种抽象和封装,基于抽象工厂模式 (Abstract Factory Pattern)NSNumberNSStringNSArray等均是如此。
    如想更深入的了解相关概念,可以查阅下面两篇文章:

    1. Sunny大神写的《从NSArray看类簇》
    2. 《Objective-C类族和工厂模式》
      代码在请见Demo中的 Demo2
  2. 下面代码打印什么内容?

    NSMutableSet *mSet = [[NSMutableSet alloc] init];
    
    [mSet addObject:@[@1, @2]];
    NSLog(@"1---%@", mSet);
    
    NSMutableArray *mArr = [[NSMutableArray alloc] initWithObjects:@1, nil];
    
    [mSet addObject:mArr];
    NSLog(@"2---%@", mSet);
    
    [mArr addObject:@2];
    NSLog(@"3---%@", mSet);
    
    [mSet addObject:@[@1, @2]];
    NSLog(@"4---%@", mSet);
    

    答案:

    面试小结_20171030_第2张图片
    2.png

    分析:

    • 集合(NSMutableSet)和数组(NSMutableArray)有相似之处,都是存储不同的对象的地址;不过NSMutableArray是有序的集合,NSMutableSet是无序的集合。
    • 集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度更快,但是它没有顺序。当插入相同的数据时,不会有任何效果。

    第一次输出时,创建了一个包含 @[@1, @2]NSMutableSet
    第二次输出时,向已经创建的 mSet 中添加一个可变数组
    第三次输出时,向前面创建的 mArr 中添加一个 @2,可以成功的将 @[@1, @2] 这个 mArr 添加到 mSet 中,应该是因为 @[@1, @2]__NSArrayImArr__NSArrayM ,不能成功的判断相等
    第四次输出时,由于集合内已经存在相同的 @[@1, @2],而 mSet 中的元素是不能重复的,所以没有成功添加

    代码在请见Demo中的Demo3


Title: 面试之旅

Date: 2017.11.09

Author: zhangpeng

Github: https://github.com/fullstack-zhangpeng

你可能感兴趣的:(面试小结_20171030)