1>裝箱和拆箱
- 裝箱的定義:就是將值類型轉(zhuǎn)換成引用類型,但是裝箱和拆箱有個大的前提就是要有繼承關(guān)系才可能發(fā)生裝箱和拆箱,
int a=10;
string str=(string) a;
這樣的不叫裝箱,叫類型轉(zhuǎn)換,因為它沒有繼承關(guān)系。
int a=10;
object o=a;
這樣的就發(fā)生了裝箱,因為object是所有類的父類,它其實是將子類的int類型的a,變成了object類型的o,有繼承關(guān)系的值類型轉(zhuǎn)換成引用類型叫裝箱。 - 拆箱:就是將引用類型轉(zhuǎn)換成值類型。
ArrayList list=new Arraylist();
聲明了一個arraylist類型的集合,這個集合里面裝的是object類型的數(shù)據(jù)。
for (int i = 0; i < 1000; i++)
{
//用for循環(huán)遍歷1000個int類型的數(shù)字,再添加到list集合里面。
//將int類型轉(zhuǎn)換成objec類型,其實就是發(fā)生可1000次裝箱。
//一般情況下盡量減少裝拆箱的次數(shù),
list.Add(i);
}
這樣的操作是拆箱,將引用類型轉(zhuǎn)換成值類型。
2>鍵值對集合
-
鍵值對集合是系統(tǒng)定義的類,要使用它時候,需將其的命名空間引入,然后創(chuàng)建該類的對象,方可使用它里面的各種方法。
////鍵值對集合
Hashtable hs = new Hashtable();#這個集合的添加是成對添加的。根據(jù)它的鍵(就是第一個元素,找到它的第二個元素) 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>字典集合
-
字典集合其實和鍵值對集合很相似,但是有些地方還不一樣的。同樣是系統(tǒng)給定義好的類,用到的時候需要實例化,但是實例化的時候就有所不同了。
// 字典集合
## <> 這個括號中的兩個數(shù)據(jù)類型,第一個是它的鍵的類型,第二個是它值的類型,這兩個類型是不固定的。
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1, "張三");
dic.Add(2, "李四");
dic.Add(3, "王五");
## 它的打印也是foreach循環(huán)來打印,也是根據(jù)它的鍵,來找它的值
foreach (int item in dic.Keys)
{
Console.WriteLine("{0}----{1}",item,dic[item]);
}
下面有一個字典集合的練習(xí)
遍歷welcome to china里面的每個字母出現(xiàn)的次數(shù),不考慮大小寫。
string str = "welcome to china";
#要得到每個字母出現(xiàn)的次數(shù),所以要將每個字母作為值,去尋找它的鍵。
#聲明一個這樣類型的字典集合,鍵為字符類型,鍵為int類型。
Dictionary<char, int> dic = new Dictionary<char, int>();
for (int i = 0; i < str.Length; i++)
{
遍歷這個string類型的數(shù)組,得到里面的每個字符串。
因為里面有相同的字符串,所以要做出判斷。
if (str[i] == ' ')//還有空格的情況就讓它跳出當(dāng)前循環(huán)。
{
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}出現(xiàn)了{(lán)1}次", kv.Key, kv.Value);
}Console.ReadKey();