装箱与拆箱

Posted wesley1680

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装箱与拆箱相关的知识,希望对你有一定的参考价值。

把值类型转换为引用类型,叫装箱。把引用类型转换为 值类型,称之为拆箱。

看例子:

1  int n = 10;
2             string s = n.ToString();//不是装箱
3 
4 
5             object o = 10;//是装箱
6 
7             Console.ReadKey();
View Code

1.定义。

2.转换的两个类型能自动兼容另一个类型。(更本质的说,二者存在直系的继承关系,而不是兄弟关系)

int继承于valuetype,valuetype继承于object.  string 直接继承object. 所以int和string不是父子类关系(是分支上的兄弟关系),也不能自动转换。

装箱或者拆箱的两个类型必须是有父子类关系的。对于toString()方法,是把一种类型转换为了另一种类型(会在内存 中开辟空间),int和string类型本身不会有自动转换的功能,所以第一种情况不是装箱。

 1  Person p = new Person();
 2             object op = p;//不是装箱,二者都是引用类型。
 3             int i = 10;
 4             double d = i;
 5             int di = (int)d;//不是拆箱,因为二者都是值类型
 6 
 7             object o1 = 10;//是装箱。
 8             int oi=(int)o1;//是拆箱。
 9 
10             Console.ReadKey();
View Code

注意:

1             double d = 10;
2             object o = d;
3             int i = (int)o;
4             Console.WriteLine(i);
View Code

上面的代码包含装箱和拆箱,但是在拆箱的时候会报错。装箱装进去的什么类型,拆箱的时候也必须用相同的类型接收。

效率问题:

 1  //ArrayList arr = new ArrayList();
 2             //Stopwatch stop = new Stopwatch();
 3             //stop.Start();
 4             //for (int i = 0; i < 20000000; i++)
 5             //{
 6             //    arr.Add(i);//耗时:00:00:04.3049126
 7             //}
 8             //stop.Stop();
 9             //Console.WriteLine(stop.Elapsed);
10 
11             List<int> list = new List<int>();
12             Stopwatch stop = new Stopwatch();
13             stop.Start();
14             for (int i = 0; i < 20000000; i++)
15             {
16                 list.Add(i);//耗时:00:00:00.3916002
17             }
18             stop.Stop();
19             Console.WriteLine(stop.Elapsed);
View Code

很明显,装箱和拆箱很耗性能。

案例:

 1  int m = 10, n = 11;
 2             string s1 = "a";
 3             string s2 = "32";
 4 
 5             string str = m + s1 + n + s2;//这里发生了两次装箱.会把int装入object.
 6             //string str = m + n + s1 + s2;//只发生了一次装箱.先把m+n计算出来,然后装箱。
 7             int p = int.Parse(str);
 8 
 9             Console.WriteLine("{0}",p);//发生了一次装箱,参数传递的是object类型。
10             //Console.WriteLine(p);//没有装箱。
View Code

 

以上是关于装箱与拆箱的主要内容,如果未能解决你的问题,请参考以下文章

Java 自动装箱与拆箱

了解Java的自动装箱与拆箱

自动装箱与拆箱

C#装箱与拆箱总结

c#装箱与拆箱

详解 Java 中的自动装箱与拆箱,5000+字,看了不懂你打我