1>装箱和拆箱
- 装箱的定义:就是将值类型转换成引用类型,但是装箱和拆箱有个大的前提就是要有继承关系才可能发生装箱和拆箱,
int a=10;
string str=(string) a;
这样的不叫装箱,叫类型转换,因为它没有继承关系。
int a=10;
object o=a;
这样的就发生了装箱,因为object是所有类的父类,它其实是将子类的int类型的a,变成了object类型的o,有继承关系的值类型转换成引用类型叫装箱。 - 拆箱:就是将引用类型转换成值类型。
ArrayList list=new Arraylist();
声明了一个arraylist类型的集合,这个集合里面装的是object类型的数据。
for (int i = 0; i < 1000; i++)
{
//用for循环遍历1000个int类型的数字,再添加到list集合里面。
//将int类型转换成objec类型,其实就是发生可1000次装箱。
//一般情况下尽量减少装拆箱的次数,
list.Add(i);
}
这样的操作是拆箱,将引用类型转换成值类型。
2>键值对集合
-
键值对集合是系统定义的类,要使用它时候,需将其的命名空间引入,然后创建该类的对象,方可使用它里面的各种方法。
////键值对集合
Hashtable hs = new Hashtable();#这个集合的添加是成对添加的。根据它的键(就是第一个元素,找到它的第二个元素) hs.Add('a', 20); hs.Add(1, "张三"); hs.Add("李四", 66); #这个集合的遍历只能用foreach去遍历 foreach (var i in hs.Keys)//遍历它的键,通过键去找值。 { #!!!!i是它的键,hs.[i]是它的值。 Console.WriteLine("{0}----{1}",i,hs[i]); }
3>字典集合
-
字典集合其实和键值对集合很相似,但是有些地方还不一样的。同样是系统给定义好的类,用到的时候需要实例化,但是实例化的时候就有所不同了。
// 字典集合
## <> 这个括号中的两个数据类型,第一个是它的键的类型,第二个是它值的类型,这两个类型是不固定的。
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "张三");
dic.Add(2, "李四");
dic.Add(3, "王五");
## 它的打印也是foreach循环来打印,也是根据它的键,来找它的值
foreach (int item in dic.Keys)
{
Console.WriteLine("{0}----{1}",item,dic[item]);
}
下面有一个字典集合的练习
遍历welcome to china里面的每个字母出现的次数,不考虑大小写。
string str = "welcome to china";
#要得到每个字母出现的次数,所以要将每个字母作为值,去寻找它的键。
#声明一个这样类型的字典集合,键为字符类型,键为int类型。
Dictionary<char, int> dic = new Dictionary<char, int>();
for (int i = 0; i < str.Length; i++)
{
遍历这个string类型的数组,得到里面的每个字符串。
因为里面有相同的字符串,所以要做出判断。
if (str[i] == ' ')//还有空格的情况就让它跳出当前循环。
{
continue;
}
if (dic.ContainsKey(str[i]))#如果它的值包含了这个字母,就给它的键加一。
{
dic[str[i]]++;//通过它的索引,得到它的值,再给它的值加一。
}
else如果不包含这个字母,就给它的值赋值为一。
{
dic[str[i]] = 1;
}
}
foreach (KeyValuePair<char, int> kv in dic)##这个遍历真TM的蛋疼,!!
{
Console.WriteLine("字母{0}出现了{1}次", kv.Key, kv.Value);
}Console.ReadKey();