欢迎来到天天文库
浏览记录
ID:30832316
大小:104.89 KB
页数:8页
时间:2019-01-03
《深入剖析java中的装箱和拆箱-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、深入剖析Java中的装箱和拆箱-编程开发技术深入剖析Java中的装箱和拆箱原文出处:海了自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就來一些看一卜•装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基木的东西,再来看一下而试笔试屮经常遇到的与装箱、拆箱相关的问题。以下是木文的目录大纲:一•什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三•而试小相关的问题若冇不正Z处,请谅解和批评指正,不胜感激。一.什么是装箱?什么是拆箱?在前面的文章中提到,九腹为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器
2、类型在此不进行阐述,有兴趣的刖友可以查阅相关资料。在JavaSE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:Integeri二newInteger(10);而在从JavaSE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:Integeri=10;这个过程屮会自动根据数值创建对应的Integer对象,这就是装箱。那什么是拆箱呢?顾名思义,跟装箱对应,就是自动将包装器类型转换为基木数据类型:Integeri=10;//装箱intn=i;//拆箱简单一点说,装箱就是?自动将基木数
3、据类型转换为包装器类型;拆箱就是?自动将包装器类型转换为基木数据类型。下表是基本数据类型对应的包装器类型:int(4字节)Integerbyte(1字节)Byteshort(2字节)Shortlong(8字节)Long
4、float(4字节)Floatdouble(8字节)Doublechar(2字节)Characterboolean(未定)Boolean一.装箱和拆箱是如何实现的上一小节了解装箱的基本概念Z后,这一小节来了解一下装箱和拆箱是如何实现的。我们就以Tnterger类为例,下面看一段代码:publicclassMain{publics
5、taticvoidmain(String[]args){Integeri=10;intn二i;}反编译class文件Z后得到如下内容:E:WorkspaceTestbinconcxhtestl>jauap-cMainCompiledfromMMain.jauaMpublicclasscon.cxh.testl.Mainextendsjaua.lang.Objecpubliccon.cxh.testl.MainO;Code■■0:aload_01:inuokespecialtt8;//Methodjaua/lang/Object.M<
6、init>M:OU4:urnpublicstaticvoidnain;Code■■0:bipush102:inuokestaticttl6;//Methodjaua/lang/In:<1>Ljaua/lang/Integer;5:astore_l6:aload_l7:inuokeuirtual#22;//Methodjaua/lang/Integ",intUalue:<>I10:istore_211:urn从反编译得到的字节码内容可以看岀,在装箱的时候自动调用的是Integer的valueOf(int)方法。而在拆箱
7、的时候自动调用的是Integer的intValue方法。其他的也类似,比如DoublcxCharacter,不相信的朋友可以门己手动尝试一下。因此可以用一句话总结装箱和拆箱的实现过程:装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的xxxValue方法实现的。(xxx代表对应的基木数据类型)。一.面试中相关的问题虽然大多数人对装箱和拆箱的概念都清楚,但是在而试和笔试屮遇到了与装箱和拆箱的问题却不一定会答得上来。下面列举一些常见的与装箱/拆箱有关的面试题。1.下面这段代码的输出结果是什么?publicclassMa
8、in{publicstaticvoidmain(String[]args){Integeril二100;Integeri2二100;Integeri3=200;Integeri4=200;System,out.println(il==i2);System,out.println(i3二二i4);也许有些朋友会说都会输岀false,或者也有朋友会说都会输出true。但是事实上输出结果是:truefalse为什么会出现这样的结果?输出结果表明11和i2指向的是同一个对象,而i3和i4指向的是不同的对象。此时只需一看源码便知究竟,下而这段代码是Int
9、eger的valueOf方法的具体实现:publicstaticIntegervalueOf(inti){if(i>=-128&&i<=Integer
此文档下载收益归作者所有