集合类型有三种:
Array数组,基于索引的有序的序列
Set,无序的,而且值是唯一的集合
Dictionary,键值对,Keys只能是唯一的,Values可以是重复的
NSArray被定义为class,引用类型,拷贝时就是指针在拷贝,指向的还是同样的对象
数组封装后具有面向对象特性,索引从0开始,索引访问越界会抛出运行时异常
NSArray的元素必须是对象,即NSObject的子类
如值类型,不能直接放入数组,要用NSNumber来封装为对象类型才可以
1.使用NSNumber将NSInteger包装为对象
2.或使用字面常量初始化
如C语言结构类型,须用NSValue封装为对象类型,才能放入数组
使用NSValue将struct包装为对象
数组元素可以是不同对象类型,可能会有类型不安全
NSArray具有常量性,长度和元素指针都不能更改,但指针指向的对象内部可以更改
两个对象默认只能比较指针是否相等,如果比较对象是否相等,必须重写NSObject的isEqual函数,然后提供值相等的比较
数组遍历,有三种方式:
最快,Fast Enumeration,快速枚举方法,优化索引检查和动态消息分发
较慢,NSEnumerator,迭代器设计模式
最慢,For循环
数组查找
indexOfObject查找值是否相等的对象
indexOfObjectIdenticalTo查找引用相等的对象
数组排序
不改变原数组(常量性),返回新数组
NSMutableArray可变数组
支持更改长度和元素指针,是NSArray的子类
NSMutableArray初始化后,会分配一个缓存容量capacity,一般大于实际容量,长度增加时,capacity会以近似二倍方式增长,代价是分配新的堆内存,长度是以前的两倍,原来堆内存的元素拷贝到新的堆内存上,再释放以前的堆内存
避免方法:给预估容量,避免以后增长
常量集合NSSet是无序集合,存储对象不能重复,被定义为class,也是引用类型
可变集合NSMutableSet,创建时提前设好capacity
集合支持Fast Enumeration和NSEnumerator,前者较快
NSDictionary是存储key-value的无序集合,key唯一,value可重复,被定义为class,引用类型
可变NSMutableDictionary,用initWithCapacity提前设capacity
Dictionary支持Fast Enumeration和NSEnumerator,前者较快