自动拆装箱(Integer举例)

什么是自动拆装箱

众所周知,java是门面向对象的语言,有8个基本的数据类型,很明显,这八个数据类型并不是一个对象,但是我们经常想要对基本的数据类型进行一些只能对对象的操作,比如判空

很明显可以发现报错, 但是在spring项目中,经常会从前端返回一个其中包含可能为空的数字的表单,这时我们可以用基本数据类型的包装类:

(除了int和char其他都是首字母大写)

     int i=10;
//        if(i==null){
//            System.out.println("i为null");
//        }
        Integer iInInteger=Integer.valueOf(i);
        if(iInInteger==null){
            System.out.println("i为null");
        }

这是的iInInteger就是一个对象,我们可以对其以对象的方式操作,同时也可以对Integer类型的数做基本数据的加减乘除操作

(一些常用的方法)

自动拆装箱

        自动拆装箱关键在自动,也就是自动的把int转化为Integer,Integer转化为int来适应程序,

其中自动装箱(int转Integer)相当于Java编译器替我们执行了 Integer.valueOf(XXX); 自动拆箱(也就是Integer转int),相当于Java编译器替我们执行了Integer.intValue(XXX),如下图,照例说实例一个对象是需要new操作的,但是因为有了自动装箱操作,所以一个Integer=int的操作可以实现,同时a这个Integer也被拆箱成为int。

// 自动装箱
1. Integer a = 100;
// 自动拆箱
2. int b = a;

 反编译查看

下面可以看下Integer.valueOf(XXX)及Integer.intValue(XXX)源码

//
public static Integer valueOf(int i) {
	if (i >= IntegerCache.low && i <= IntegerCache.high)//大于-128且小于127
		return IntegerCache.cache[i + (-IntegerCache.low)];
	return new Integer(i);
}


private final int value;

public int intValue() {
	return value;
}

 我们可以看到,首先是if方法, 对传入的int 数值进行判断,如果 i >= -128 且i <= 127 那么就会从IntegerCache缓存中获取指定数字的封装类,如果不存在则 new 出一个新的封装类,关于 IntegerCache ,其内部实现了一个Integer的静态常量数组,在类加载的时候,执行static静态块进行初始化-128~127之间的Integer对象,存放到cache数组中,cache属于常量,存放在java的方法区中
 

1. Integer a = new Integer(100);
2. Integer b = 5;
3. b+=10;

第一行代码:new 了一个 Integer 对象实例,将 int 类型的数据传入包装成了 Integer 类型。未使用自动拆装箱。

第二行代码:首先我们知道5 是 int 类型的,但是等待复制的 b 是 Integer 类型,此时就用到了自动装箱,b = Integer.valueOf(5),将5包装成包装类了

第三行代码:用到了自动装箱+自动拆箱,b = b + 10 = Integer.intValye(b) + 10此时计算结果得到的应该是 int 类型的 b,但是 b 又被限定了是 Integer 类型,所以就又要用到 Integet.valueOf() 自动装箱。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值