在Objective-C编程语言的字符串表示使用NSString 和它的子类NSMutableString的创建字符串对象提供了几种方法。
创建一个字符串对象可以使用格式字符串和参数构造,类方法也是可以的:
//使用字面量创建字符串
NSString *string_0 = @"hello futu";
//使用类方法创建字符串
NSString * string_1 = [NSString string];
string_1 = @"hello futu";//字符串赋值
//创建一个字符串,并且将内容设置为string
NSString * string_2 = [NSString stringWithString:string_1];
//格式化创建字符串(按照格式输出)
NSString * string_3 = [NSString stringWithFormat:@"%@",string_1];
NSString * string_4 = [NSString stringWithFormat:@"hello futu %d %c",5,'A'];
//实例方法初始化
NSString *string_5 = [[NSString alloc] init];
//实例方法指定字符串
NSString *string_6 = [[NSString alloc] initWithString:string_3];
//实例方法创建字符串
NSString *string_7 = [[NSString alloc] initWithFormat:@"%@",string_4 ];
字符串常量从程序的执行开始到终止一直存在,调用 release 方法或者垃圾回收都不能释放字符串常量。
//返回字符串字符个数
NSString *str = @"hello futu";
//方法一
NSInteger length1 = [str length];
//方法二
NSInteger length2 = str.length;
个人更喜欢第二种写法,java里就是这么写的。
比较是字符串中的常见操作,那么只要说到比较,就一定会分为对象比较和内容比较。
//比较地址
if (str1 == str2) {
NSLog(@"sanme");
} else {
NSLog(@"different");
}
//比较内容
if ([str1 isEqualToString:str2]) {
NSLog(@"sanme");
} else {
NSLog(@"different");
}
isEqualToString
:直接判断字符串内容是否一致
==
:比较指向的地址是否一致,检查两个对象是否为同一事物
除此之外,compare
也是需要重点注意的,它本身进行的是区分大小写的比较。不过compare:options
弥补了这一缺点,他给了我们更多灵活的选项。
假如我们想比较字符串,希望忽略大小并按字符个数排序,就可以使用上述选项
if ([str1 compare:str2 options: NSCaseInsensitiveSearch | NSNumericSearch] == NSOrderedSame)
{
NSLog(@"match");
}
//字符串拼接的两种方法
NSString *str3 = [str1 stringByAppendingString:str2];
NSString *str4 = [NSString stringWithFormat:@"%@%@",str1,str2];
//检测字符是否以指定内容开头
if ([str hasPrefix:@"shan"]) {
NSLog(@"是的");
}
//检测字符串是否以指定内容结尾
if ([str hasSuffix:@"long"]) {
NSLog(@"是的");
}
//字符串截取
//从哪个索引开始截取到字符串末尾(包含索引位置)
NSString *str0 = [string substringFromIndex:4];
//从字符串开头截取到哪个索引(不包含索引位置)
NSString *str1 = [string substringToIndex:8];
//截取一定范围(从下标3开始截取4个字符)
NSRange range = {3,4};
NSString *str2 = [string substringWithRange:range];
学过java的直接用string和(stringBuilder 和 stringBuffer)对比着理解就好,基本上一模一样。
NSString 是不可变(immutable)的,也就是一旦创建便不可更改,例如删除字符和添加字符的操作是不可以的。所以,我们就用NSMutableString这个子类来操作。
NSMutableString * str1 = [[NSMutableString alloc]init];
//还可以通过类方法来创建
NSMutableString * str2 = [NSMutableString string];
//用格式化方法创建一个可变的字符串
str1 = [NSMutableString stringWithFormat:@"%d",12];
//指定初始化大小创建一个可变字符串(创建一个长度为10的字符串)
str2 = [[NSMutableString alloc]initWithCapacity:10];
//用另一个指定的字符串创建一个可变的字符串
str3 = [NSMutableString stringWithString:str1];
[str1 appendString:@"345"];
//格式化拼接
[str1 appendFormat:@"%@",@"来到葫芦岛"];
//增
[str1 insertString:@"天气" atIndex:3];//位置
//改(替换)
[str1 replaceCharactersInRange:NSMakeRange(0, 3) withString:@"B 哥"];
//删
[str1 deleteCharactersInRange:NSMakeRange(3,5)];
优点:可以放入任意类型的对象
缺点:只可以存储 Objective-C 的对象,而不可以存储原始 C 语言基础数据类型(int、float、enu m、struct)。同时你也不可以存储 nil,因为 nil 正是代表 Array 列表结束的标志。但在使用字面量语法时,你不必特意补上 nil。
NSArray *a=[NSArray arrayWithObjects:@"one",@"two",@"three",nil];
NSArray *b=@[@"one",@"two",@"three"];
//方法一
long count = b.count;
//方法二
count = [arr count];
这里直接就套java或者C的理解就行
//根据下标,获取下标对应的对象
//方法一
NSString *str = [arr objectAtIndex:2];
//方法二
NSString *str = arr[1];
//返回元素的下标:
int intnum = [arr indexOfObject:”four”];//返回的下标是3
数组中是否包含了某个元素:
if ([arrcontainsObject:@”four”] == YES){
NSLog(@”包含此元素”);
} else {
NSLog(@”不包含此元素”);
}
//定义一个数组:
NSArray*arr =@[@”1”,@”2”,@”3”,@”4”];
把数组拼接成字符串
//把数组arr中的元素用“-”连接起来,变成1-2-3-4
NSString*str = [arr componentsJoinedByString: @”-”];
NSLog(@”str = %@”,str);//打印结果:str = 1-2-3-4
//把字符串拆分成数组
NSArray *aArray = [str componentsSeparatedByString:@"-"];;
NSLog(@”aArray= %@”,aArray);//打印
可变数组给人的感觉就像java中的包装类概念,弥补了基类的缺陷,还提供了更多增删改的操作,同时还从NSArray继承了大量好用的功能。
为数组分配内存空间
NSMutableArray *array = [NSMutabeArray arrayWithCapacity:10];
//初始化可变数组对象的长度,如果后面代码继续添加数组超过长度10以后NSMutableArray的长度会自动扩充,10是自己可以设置的颗粒度。
数组容量只是数组最终大小的一个参考,这个容量值不会用来限制数组的大小。
NSMutableArray*array = [NSMutableArray arrayWithCapacity:10];
[array addObject:@“One”];
[array addObject:@“Two”];
NSLog(@“array:%@”,array);
NSArray *array = @[@"One",@"Two",@"Three"];
NSMutableArray*mutArr = [NSMutableArray arrayWithArray:array];
NSLog(@“mutArr=%@”,mutArr);
[array removeObject:(id)] :删除数组中指定元素,根据对象isEqual消息判断。
[array removeObjectIdenticalTo:(id)] :删除数组中指定元素,根据对象的地址判断
[array removeObjectIdenticalTo:(id) inRange:(NSRange)] :在指定范围内删除指定的元素。
[array removeObjectAtIndex:(NSUInteger)]:删除数组中指定脚标索引的数据。
[array removeObjectsInArray:(NSArray *)] :删除一个数组的元素。
[array removeAllObjects]:删除数组中所有的元素(清空数组)
说明:array是可变数组
NSMutableArray *mutArr = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three", nil];
[mutArr replaceObjectAtIndex:2 withObject:@"Four"];
NSLog(@"mutArr= %@",mutArr);
NSObject *obj = [[NSObject alloc] init];
NSMutableArray *muArray = [NSMutableArray arrayWithCapacity:6];
[muArray addObject:@"对象1"];
[muArray addObject:@"对象2"];
[muArray addObject:obj];
NSEnumerator *enmuerator = [muArray objectEnumerator];
id object;
while(object = [enmuerator nextObject]) {
NSLog(@"数组中的对象:%@",object);
这个理解为hashmap的散列表,里面用键值对(k-value)存储数据,但是这个是不可变类。也就是说必须一次性创建好全部对象和关键字, 并且value只能存放OC对象。大概看了下底层的源码,它的哈希算法还是基本和hashmap的原理一样,put操作时利用ke y和数组长度进行&运算,有空好好看看底层是怎么对散列表的数组扩容和如何解决哈希碰撞的。
//初始化
NSDictionary *dict = @{@"name":@"rose",@"age":@"18",@"addredd":@"BeiJingXXSttreet"};
//利用key取出value,不存在的话,会返回null
NSLog(@"%@",dict[@"name"]);
//创建可变字典数组.
NSMutableDictionary *dict1 = [NSMutableDictionary new];
NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
NSMutableDictionary *dict3 = [NSMutableDictionary dictionary];
这样创建出来的可变字典数组的长度为0 但是有意义 因为可以动态的新增和删除.
//新增键值对
dictionaryWithObjectsAndKeys:@"jack",@"name",@"18",@"age", nil];[dict setObject:@"wayne" forKey:@"name"];
NSLog(@"%@",dict[@"name"]);
这里要注意,如果键重复,会覆盖原有的。
//删除所有的键值对
[dict removeAllObjects];
//删除指定的键值对
[dict removeObjectForKey:@"name"];