关于JAVA的包装类自动拆箱和装箱,有很多人做过介绍,但笔者发现说的不够简洁,而这个问题在面试、笔试中又经常涉及,故笔者将搜集到的信息与大家分享下:
包装类(原始类型对应的类,即Boolean, Byte, Short, Integer, Long, Float, Double, Character)的自动拆、装箱分别是指如下的过程:
装箱:是指基本类型变为相应包装类的过程,如Integer a=Integer.valueOf(100);或者int a=100;Integer b=new Integer(a);这里的Integer.valueOf(100)和new Integer(a)就是装箱,由基本数据类型构造出一个包装类的对象。
拆箱:就是装箱的逆过程。如Integer a=new Integer(100);int b=a.intValue();这里的a.intValue()就是拆箱的过程,由一个包装类对象转换到相应的基本数据类型。
自动装箱、拆箱:指编译器帮助开发人员完成包装类的装箱和拆箱过程,也就是在将*.java文件编译成*.class文件的过程中完成。本文的目的是要介绍一下,编译器在何时才进行自动装箱、拆箱。
包装类的自动装箱和拆箱规则如下:
- 遇到赋值运算符“=”(包括传参数,参数传递属于隐式赋值)时,会将包装类拆箱或装箱为相应类型
- 遇到算术运算符、位运算符和位移运算符“+, ++, --, -, *, /, %, &, |, ^, ~, <<, >>, >>>”时,对包装类进行拆箱
- 遇到关系运算符">, <, >=, <="(不包括“==”和“!=”哦)时,对包装类进行拆箱
- 对关系运算符"==, !="而言,遇到数字常量或算术表达式时,才对包装类进行拆箱
其余情况下,不进行自动的装箱和拆箱,注意啊,这里说的是自动装箱和拆箱。
对照上述的规则,来看几个例子吧。这里分别给出*.java文件里的代码和*.class文件里的代码,后者是编译器进行自动装箱和拆箱后的结果,读者可以对比两张图片的内容来加深理解。这里就不再累述了。
图1 *.java文件里的内容
图2 *.class文件里的内容
值得一提的是,
包装类的equals方法不支持数据类型的自动转换。例如Integer类的equals方法是这样的:
本文采用的实验环境是jdk1.7.0_21。如有错误,还请指正,非常感谢。