包装类间的关系
自动装箱和自动拆箱
JDK1.5以后,基础类型和包装类可以自动转换
自动装箱:基本->包装 ; 调用 包装类.valueOf(基本类型)
自动拆箱:包装->基本 ; 调用 **Value()
自动拆装箱的原理
自动调用方法转换
自动装箱: Integer.valueOf(1)
1 | Integer integer=1; |
自动拆箱: integer.intValue();
1 | int i=integer; |
触发自动拆装箱
除了直接赋值以外,其它的触发方式
函数参数与返回值
1 | //自动拆箱 |
包装类型和基本类型的 运算
包装类与基本数据类型进行比较运算,是先将包装类进行拆箱成基本数据类型,然后进行比较的。
1 | Integer a=1; |
对以上代码进行反编译,得到以下代码:
1 | Integer a=1; |
包装类型的 四则运算
对Integer对象进行四则运算的时候,两个包装类型之间的运算,会被自动拆箱成基本类型进行。
1 | Integer i = 10; |
反编译后代码如下:
1 | Integer i = Integer.valueOf(10); |
基本数据类型放入集合类
Java中的集合类只能接收对象类型
1 | List<Integer> li = new ArrayList<>(); |
将上面代码进行反编译,可以得到以下代码:
1 | List<Integer> li = new ArrayList<>(); |
以上,我们可以得出结论,当我们把基本数据类型放入集合类中的时候,会进行自动装箱。
三目运算符的使用
三目运算符:
1 | boolean flag = true; |
在int k = flag ? i : j;这一行,会发生自动拆箱。反编译后代码如下:
1 | boolean flag = true; |
这其实是三目运算符的语法规范:当第二,第三位操作数分别为基本类型和对象时,其中的对象就会拆箱为基本类型进行操作。
因为例子中,flag ? i : j;片段中,第二段的i是一个包装类型的对象,而第三段的j是一个基本类型,所以会对包装类进行自动拆箱。如果这个时候i的值为null,那么久会发生NPE。(自动拆箱导致空指针异常)
缓存
包装类与基础类型的对应关系及其缓存范围:
当自动装箱时,即使用Integer.valueOf(40)
时,会触发缓存机制,在缓存范围内的直接指向缓存地址
而使用 new Integer(40)
创建新对象时,始终会创建新对象而不使用缓存
使用 ==
比较两个包装类,比较的是地址,比较结果在缓存范围内外会不一致。
比较两个包装类不使用 ==
, 使用 equals(obj)
。而 equals 比较的始终是具体值,需注意包装类的空指针异常