容器在开发中很有用,帮助我们很方便的在内存中对数据进行增删改查这样的操作。需要特别注意的是:容器只能存放对象。
ios中容器分为不可变容器和可变容器:
不可变容器有NSArray,NSSet和NSDictionary。
可变容器有NSMutableArray,NSMutableSet和NSMutableDictionary。
可变的意思是长度可变,元素可变。不可变的容器,创建时什么样销毁前还是什么样,不能对其内容进行修改。
可变容器是不可变容器的子类,一般情况下,子类的功能是强于父类的。
不喜欢不可变的,太没意思了,直接开始研究可变容器:
1.NSMutableArray
数组(NSMutableArray)是一种线性表,感觉oc中是采用数组(C语言中的数组概念)来实现的,可以放入相同的对象。在任意位置插入元素,修改任意位置元素,删除任意位置元素。查找元素是否在数组中。但是值得注意的是,在非结尾插入,删除效率并不高。查找元素效率也不高。尽可能避免大量的这种操作。
常用方法:
添加元素
[mArray addObject:@1];//添加元素,添加到结尾
[mArray addObjectsFromArray:array];//添加一批元素
[mArray insertObject:@2 atIndex:1];//在下标1的地方插入2,其余元素会依次向后移动,数组长度加1
删除元素
[mArray removeObject:@1];//删除首先出现的值为1的对象
[mArray removeObjectAtIndex:1];//删除下标为1的元素
[mArray removeAllObjects];//删除全部元素
修改元素
[mArray replaceObjectAtIndex:1 withObject:@4];//替换下标1的位置元素,换成4
查找元素
[mArray firstObject];//获取第一个元素
[mArray objectAtIndex:1];//获取下标为1的元素
[mArray lastObject];获取最后一个元素
[mArray containsObject:@1];判断是否包含元素1
求长度
[mArray count];
遍历:
for(id obj in mArray ){
NSLog(@"%@",obj);
}
2.NSMutableSet
集合是数学中一个重要的概念,里面存放的元素互不相同。根据对代码的测试,发现插入一些数据后,遍历结果并不是顺序输出,可以推断出oc中Set实现方法是Hash。它的特点是查找快,插入快,删除快,存放对象唯一,元素无序。缺点也是有的,占用较大的内存空间。当元素个数达到临界值后,会进行扩容和重散列,这是速度是慢的。在java中Set有TreeSet和HashSet。TreeSet,插入,删除,查找效率都比Hash的慢,但是占用空间小,不需要重散列,扩容时代价也小,当集合中元素个数少的时候,效率还是很不错的。
常用方法:
[mSet count];//长度
[mSet addObject:@6];//添加元素
[mSet removeObject:@1];//删除元素
[mSet containsObject:@2];//是否包含元素
遍历:
for(id obj in mSet){
NSLog(@"%@",obj);//1 6 2 20 1009
}
3.NSMutableDictionary
字典用来存放键值对,一个key对应到一个value。相当与java中的Map,更确切的说是HashMap,实现方式是Hash表,和Set类似,不同的是,这里存放的是key和value。优缺点也一样。
创建
NSMutableDictionary *mDictionary=[NSMutableDictionary dictionaryWithCapacity:30];
插入
[mDictionary setObject:@"张三" forKey:@"name"];
获取键值对个数
[mDictionary count];
查询
通过key获取value
[mDictionary objectForKey:@"name"];
删除
通过key移除所对应的value
[mDictionary removeObjectForKey:@"name"];
删除全部
[mDictionary removeAllObjects];
遍历
遍历1
NSArray *arr=[mDictionary allKeys];
for(id obj in arr){
NSLog(@"%@",[mDictionary objectForKey:obj]);
}
遍历2
NSEnumerator * enumerator = [mDictionary keyEnumerator];
for(id obj in enumerator){
NSLog(@"%@",[mDictionary objectForKey:obj]);
}
这一篇花了好长时间,本来打算只简单介绍一下NSArray的,其余两个就不介绍了,没忍住,写了一下
看代码吧:
//
// main.m
// HelloWorld
//
// Created by Moluth on 17/4/6.
// Copyright (c) 2017年 Moluth. All rights reserved.
//
#import
int main(int argc, const char * argv[]) {
//不可变容器
NSArray *array;//数组
NSSet *set;//集合
NSDictionary *dictionary;//字典
NSObject *o;
//可变容器,分别是以上三个类的子类
NSMutableArray *mArray=[[NSMutableArray alloc] initWithCapacity:3];//可变数组期望长度是3,这个值应该尽可能的略大于与之后最长长度
NSMutableSet *mSet=[[NSMutableSet alloc] initWithCapacity:10];//可变集合
NSMutableDictionary *mDictionary=[NSMutableDictionary dictionaryWithCapacity:30];//可变字典
////////////////////////数组/////////////////////////////
[mArray addObject:@1];//添加元素,添加到结尾
[mArray addObject:@2];
NSLog(@"%ld",[mArray count]);//2
[mArray addObject:@3];
[mArray addObject:@4];
NSLog(@"%ld",[mArray count]);//4
NSLog(@"%@",[mArray firstObject]);//1
NSLog(@"%@",[mArray objectAtIndex:1]);//2
NSLog(@"%@",[mArray lastObject]);//4
for(id obj in mArray){
NSLog(@"%@",obj);//1 2 3 4
}
[mArray removeObjectAtIndex:1];//删除下标为1的元素
for(id obj in mArray){
NSLog(@"%@",obj);//1 3 4
}
[mArray insertObject:@2 atIndex:1];//在下标1的地方插入2,其余元素会依次向后移动,数组长度加1
for(id obj in mArray){
NSLog(@"%@",obj);//1 2 3 4
}
[mArray replaceObjectAtIndex:1 withObject:@4];//替换下标1的位置元素,换成4
for(id obj in mArray){
NSLog(@"%@",obj);//1 4 3 4
}
NSLog(@"%d",[mArray containsObject:@1]);//1 是否包含对象
[mArray removeAllObjects];//删除全部元素
NSLog(@"%d",[mArray containsObject:@1]);//0
//////////////////////集合////////////////////
[mSet addObject:@1];
NSLog(@"%ld",[mSet count]);//1
[mSet addObject:@1];
NSLog(@"%ld",[mSet count]);//1
[mSet addObject:@2];
NSLog(@"%ld",[mSet count]);//2
[mSet addObject:@1009];
[mSet addObject:@20];
[mSet addObject:@6];
for(id obj in mSet){
NSLog(@"%@",obj);//1 6 2 20 1009
}
[mSet removeObject:@1];
[mSet containsObject:@2];
//////////////////字典////////////////////
[mDictionary setObject:@"张三" forKey:@"name"];
[mDictionary count];
[mDictionary objectForKey:@"name"];
[mDictionary removeObjectForKey:@"name"];
[mDictionary removeAllObjects];
[mDictionary setObject:@"张三" forKey:@"name"];
[mDictionary setObject:@"1111" forKey:@"age"];
//遍历1
NSArray *arr=[mDictionary allKeys];
for(id obj in arr){
NSLog(@"%@",[mDictionary objectForKey:obj]);
}
//遍历2
NSEnumerator * enumerator = [mDictionary keyEnumerator];
for(id obj in enumerator){
NSLog(@"%@",[mDictionary objectForKey:obj]);
}
return 0;
}