包装类

byte   => Byte
boolean    => Boolean
short    => Short
char    => Character
int    => Integer
long    => Long
float    => Float
double    => Double

使用包装对象原因:集合Collection只能接受对象,所以必须基本类型转换成包装类才能使用

装箱、拆箱
Integer i = new Integer(10);// 装箱
int value = i.intValue();// 拆箱

自动装箱、自动拆箱,好处是可以减少开发人员的工作量
Integer i =10;// 自动装箱
int b= i;// 自动拆箱

自动装箱和自动拆箱反编译后,得到:
Integer integer=Integer.valueOf(1);
int i=integer.intValue();

即自动装箱和自动拆箱函数:valueOf(int)、intValue()

哪些地方会自动装箱、自动拆箱?
(1)把基本类型放到集合中
(2)包装类型数值运算 Integer + Integer
(3)包装类型和基本类型使用 > < = 比较 if(Integer > int) if(Integer == Integer)
(4)包装类型逻辑运算 if(Boolean)
等等

注意:自动拆箱可能会引起NPE,典型例子:当3目运算第三个参数是基本类型,第二个参数是包装类型时,会对第二个参数拆箱,如果第二个参数为空,则会引发空指针异常

Integer i = null;
Integer x = ture ? i : 3;
由于i为null,且对i自动拆箱,所以引发NPE
Integer x = true ? i : Integer(3);

这时i不会自动拆箱,得到x为null而已

自动装箱的缓存问题,对于Integer
(1)使用自动装箱产生的对象
(2)范围在-128到+127之间
会直接返回Integer对象中缓存好的实例Integer,源码如下:
public static Integer valueOf(int i) {
        // 范围在-128到+127之间,就在缓存中获取
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}
private static class IntegerCache {
        static final Integer cache[]; // 缓存中Integer的数组
}

所以:
Integer i = 8;
Integer j = 8;
System.out.print(i == j)
输出true,尽管是两个对象的比较,但实际比较是缓存中的地址,所以是一样的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值