字符串是个引用类型,特殊的引用类型。
string 关键字
String str = new String(); =》 简化 string str = "123";
1.字符串可以看成一个字符数组。
2.str.Length表示指定字符串的字符个数。
3.字符串对象一旦创建,这个字符串就不能被修改了。
4.创建1个字符串对象的时候,会先去字符串拘留池中寻找是否有相同字符串内容的对象。如果有就直接让变量指向这个对象,若没有,就创立。
5.如何清理?GC.Collect();字符串一旦创建,不会被GC回收。(其他语言也是这样的哦)
6.字符串的恒定性:以上内容。
字符串常用方法
1.构造方法只能传递字符数组。
2.Length属性代表字符的个数
3.string.Empty代表1个空的字符串;“”强调不是指null;
4.string.Compare(s1,s2);比较两字符串的大小。
5.string.Concat(s1,s2);连接两字符串。
6.Contains方法,判断指定的串里面是否包含指定的子串。
7.判断指定的字符串是否已指定的字符结尾 str.EndWith("!");
8.Equals方法,判断指定字符串的内容是不是与指定的串相同
9.Format(String, Object)格式化字符串
string str = string.Format(" 我爱{0},你爱{1}","你","他");
10.IndexOf() 返回字符串的索引。
11.LaseIndexOf();从字符串的结尾往前查,第一次字符串出现的索引。
12.string str2 = Insert(1,str); 在字符串的指定位置插入字符串。
13.IsNullEmpty():是用来判断指定的串是不是null,或者string.Empty;
14.Remove(4):从第4个开始删,保留前面,删除后面
Remove(1,2):从指定下标删除指定的个数的字符
15.Replace(str,str2);替换。
16.Split(',',';'):通过,号分隔字符串,并且用;号分隔,返回数组。
也可同字符串分隔
string[] lines = str3.Split(new string[]{"门上"},StringSplitOptions.RemoveEmptyEntries);
17.Substring(4,3):切割字符串(从第几个开始切,切几个?)
只传一个,就是将前面的切掉
18.ToCharArray() :将字符串转换为字符数组
19.ToLower():转换为小写
20.ToUpper():转换为大写
21.Trim():去掉空格
StringBuilder
目的:是为了防止String多次创建类,浪费时间
仅仅是个类,不能被继承
SringBuilder sb = new StringBuilder();用来处理我们String类型的
sb.Append(); 在追加字符串。
特点:StringBuilder对象是可变的。当改变这个对象的字符串时,不会去新开空间,而是直接改变。
StringBuilder高效的字符串操作,大批量进行字符串操作时,使用StringBuilder提升性能。
StringBuilder != String; ToString();
StringBuilder仅仅是拼接字符串的工具,大多数情况下还需要把StringBuilder转换成String;
集合ArrayList(动态数组)
1.0 新增元素 Add;
1.1 ArrayList内部储存数据的是1个object数组,创建这个类的对象的时候,这个对象的数组的长度为0;
1.2 调用Add方法加元素的时候,如果第一次增加元素,就会将数组的长度变成4,往数组里加。
1.3 如果储存数据的数组满了,就会新建1个数组长度是原来的数组的2被,这个数组被原来数组的变量所引用。
1.4 AddRange方法,添加1个实现IConnection接口的类的对象,数组就实现这个接口。
1.5 Capacity表示object数组的长度。
1.6 list[0] = 110; 修改元素的值,可以通过索引器来取值或者修改值
1.7 遍历。数组元素的个数 Count(),Count()属性代表是动态数组里的元素的个数。
1.8.删除。Remove(元素值?);可以删除指定的值类型对象、引用类型对象,删除的是第一个。
RemoveAt(index);删除指定下标的元素
RemoveRange(1,2);从第1个开始删,删2个
注意:删除后,后面元素会补上。
Clear(); 清空动态数组,清空后数组的长度不变。
1.9 InsertRange() 插入一个数组
ForEach原理
1.如果我们的类要是用foreach,则必须实现IEnumerable这个接口
foreach(int i in list1)
{
Console.writeLine(i);
}
2.为啥?forEach背后的代码:
IEnumerator tor = j.GetEnumerator(); //定义在IEnumerable
while(tor.MoveNext())
{
Console.WritleLine(tor.Current);
}
GetEnumerator():这个方法返回1个实现了IEnumerator接口的对象。
3.所以我们要实现IEnumerable这个接口中的GetEnumerator()的话,就要写1个类来实现IEnumerator接口。并在GetEnumerator()方法中返回这个类的实例。
4.IEnumerator接口定义1个Current只读属性,MoveNext方法, Reset方法
5.MoveNext方法的作用,将指针向前移动一位,并判断当前位是否有元素,如果有返回true;没有返回false
6.Current只读属性,得到当前指针指向的值。
7.这两个方法都是操作指针在数组上移动,数组在集合类中。所以想办法将集合类中的数组传递到当前迭代器类中。
8.迭代器对象在集合类中创建,所以可以通过构造函数让集合将他的数组传递给迭代器,这时候迭代器对象中已经有了数组的引用。
9.实现MoveNext方法,声明index变量,用来保存当前指针指向的数组的索引,默认是-1.
每调用一次这个方法,指针就向前移动一位,所以index++;
判断数组【index】这个元素是否存在。 index<Count时候就存在。
所以迭代器对象还需要知道元素的有效个数,通过构造函数传入。
10.实现Current属性,
直接返回指针指向的数据 return arr[index];
IEnumerator里面有三个抽象类
1.Current(): 返回当前指针指向的元素的值
2.MoveNext():是将指针向前移动1位,并判断当前位有没有元素
3.Reset();
集合Hashtable
table(key,string):键值对
改值要通过key确定。
删除要通过key确定。
Remove(“小明”);
Clear();
遍历
table.Keys 保存了所有键的集合
foreach(object obj in table.Keys)
{
Console.Writrline(table[obj]);
}
如果直接遍历Hashtable,每一个遍历项都是一个DictionaryEntry对象里的key和Value属性保存了每一个键值
foreach(Object obj in table)
{
DictionaryEntry en = (DictionaryEntry) obj;
Console.WriteLine(en.Key);
}
table.Values 保存了所有值的集合。可以直接遍历
table.Contains 是否包含特定的键。
table.ContainsValue是否包含特定的值
Count()哈希表中元素的个数。