自动装箱和自动拆箱源码分析_第1页
自动装箱和自动拆箱源码分析_第2页
自动装箱和自动拆箱源码分析_第3页
自动装箱和自动拆箱源码分析_第4页
自动装箱和自动拆箱源码分析_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、自动装箱(boxing)和自动拆箱(unboxing)首先了解下Java的四类八种基本数据类型基本类型占用空间(Byte)表示范围包装器类型boolean1/8true|falseBooleanchar2-128127Characterbyte1-128127Byteshort2-215215-1Shortint4-231231-1Integerlong8-263263-1Longfloat4-3.403E383.403E38Floatdouble8-1.798E3081.798E308Double自动装箱Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装

2、器类型。如下清单1:Testpublic void boxingTest() Integer i1 = 17;Integer i2 = 17;Integer i3 = 137;Integer i4 = 137;System.out.println(i1 = i2);11 System.out.println(i3 = i4);输出:truefalse解释下清单1第11句输出true的原因:当包装器类型进行“=”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型。/* Returns an code Integer instance representing the

3、 specified* code int value. If a new code Integer instance is not* required, this method should generally be used in preference to* the constructor link #Integer(int), as this method is likely* to yield significantly better space and time performance by* caching frequently requested values.* This me

4、thod will always cache values in the range -128 to 127,* inclusive, and may cache other values outside of this range.* param i an code int value.* return an code Integer instance representing code i.* since 1.5*/public static Integer valueOf(int i) if (i >= IntegerCache.low && i <= Int

5、egerCache.high)return IntegerCache.cachei + (-IntegerCache.low);return new Integer(i);从源码中可以看出,Integer对象自动缓存int值范围在lowhigh(-128127),如果超出这个范围则会自动装箱为包装类。Note:1. Integer、Short、Byte、Character、Long这几个包装类的valueOf方法的实现是类似的;2. Double、Float的valueOf方法的实现是类似的。3. Boolean的valueOf方法的实现是个三目运算,形如  return&

6、#160;(b ? TRUE : FALSE);  自动拆箱Java中所谓的拆箱通俗点就是:八种包装器类型在某些条件下使用时,会自动变为对应的基本数据类型。清单2:Testpublic void unboxingTest() Integer i1 = 17;int i2 = 17;int i3 = 137;Integer i4 = 137;System.out.println(i1 = i2);10 System.out.println(i3 = i4);输出:truetrue解释下清单2第10句输出true的原因:当程序执行到第10

7、句时,i4会调用IValue方法自动拆箱包装器类型为基本数据类型。/* Returns the value of this code Integer as an* code int.*/public int intValue() return value;从源码可以看出,当包装器类型和基本数据类型进行“=”比较时,包装器类型会自动拆箱为基本数据类型。清单3内容如下:Testpublic void unboxingTest() Integer i1 = 17;Integer i2 = 17;Integer i3 = 137;Integer i4 = 137;/ =System

8、.out.println(i1 = i2);System.out.println(i3 = i4);/ equalsSystem.out.println(i1.equals(i2);15 System.out.println(i3.equals(i4);输出:truefalsetruetrue解释第15句为什么会输出true:因为在Integer包装类实现的equals方法中,只要比较的当前对象是Integer实例,那么就会自动拆箱为基本数据类型。从以下Integer类的equals方法的源码就可看出: /* Compares this object to the specified obje

9、ct. The result is* code true if and only if the argument is not* code null and is an code Integer object that* contains the same code int value as this object.* param obj the object to compare with.* return code true if the objects are the same;* code false otherwise.*/public boolean equals(Object o

10、bj) if (obj instanceof Integer) return value = (Integer)obj).intValue();return false;Note:1. Integer、Short、Byte、Character、Long这几个包装类的intValue方法的实现是类似的;2. Double、Float的intValue方法的实现是类似的。3. Boolean的booleanValue方法的实现和intValue方法的实现也是类似的。装箱拆箱综合清单:public static void main(String args) Integer a = 1;Integer

11、 b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;Long g = 3L;Long h = 2L;/ 会自动拆箱(会调用intValue方法)System.out.println(c=d);/ 会自动拆箱后再自动装箱System.out.println(e=f);/ 虽然“=”比较的是引用的是否是同一对象,但这里有算术运算,如果该引用为包装器类型则会导致自动拆箱System.out.println(c=(a+b);/ equals 比较的是引用的对象的内容(值)是否相等,但这里有算术运算,如果该引用为包装器类型则会导 / 致自动拆箱,再自动装箱/ a+b触发自动拆箱得到值后,再自动装箱与c比较System.out.println(c.equals(a+b);/ 首先a+b触发自动拆箱后值为int型,所以比较的是值是否相等System.out.println(g=(a+b);/ 首先a+b触发自动拆箱后值为int型,自动装箱后为Integer型,然后g为Long型System.out.println(g.equals(a+b);/ 首先a+h触发自动拆箱后值为long型,因为int型的a会自动转型为long型的g然后自动装箱后为Long型, / 而g也为Long型System.o

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论