java 装箱类型总结
- 概述
在java中有这8种基本类型:char、byte、short、int、long、float、double、boolean,但它们没有属性与方法,为了解决了这个问题,包装类应运而生,8中基本类型各自有着对应的包装类。
基本类型 | 包装类 |
---|---|
char | Character |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
- 装箱以及拆箱
所谓装箱就是把基本类型变成包装类,而拆箱则正好相反,是把包装类变为基本类型。
例如:
Integer a = 10;//装箱
在这段代码中,系统自动调用的是Integer的valueOf(int)方法,将基本类型int转为了对应的包装类Integer,这是隐式装箱。有兴趣的同学可以通过反汇编编译生成的字节码文件.class进行验证。
当然,除了这种最基本的装箱方式外,还可以通过强制类型转换以及动态创建new进行装箱。
Integer a = (Integer)10;//通过强制类型转换进行装箱
Integer a = new Integer(10);//在堆上创建对象
需要注意的是Integer的valueOf(int)方法,它判断变量是否在 IntegerCache 的最小值(-128)和最大值(127)之间,如果在,则返回常量池中的内容,否则 new 一个 Integer 对象。因此,在进行比较操作时需要留意。
拆箱过程是通过调用包装器的 xxxValue方法实现的(xxx代表对应的基本数据类型),例如:
Integer a = 10;//装箱
int b = a;//拆箱 intValue()方法
int c = (int)a;//显式拆箱
而对于拆箱同样拥有值得让人注意的地方:
Integer a = new Integer(5);
Integer a = new Integer(5);
Integer a = new Integer(10);
System.out.println( a == b );//false
System.out.println( c == a + b );//true
a、b都是通过关键字new在堆上创建的对象,所以a==b为false。但由于a和b是 Integer 对象,是不能使用+运算符的。所以a 和b 会进行自动拆箱操作,拆箱成int后再进行数值加法运算。而c因为要与拆箱后的a+b进行比较,也会进行拆箱,因此c拆箱后再与之比较。所以 c == a+c 其实是比较的 int 型数值是否相等,所以为true。