扫码关注公众号
java 语句 Integer i = 1; i += 1; 做了哪些事情?
答:首先Integeri=1;做了自动装箱(使用valueOf()方法将int装箱为Integer类型),接着i+=1;先将Integer类型的i自动拆箱成int(使用intValue()方法将Integer拆箱为int),完成加法运行之后的i再装箱成Integer类型。
何为装箱与拆箱
装箱就是将基本数据类型转化为包装类型,那么拆箱就是将包装类型转化为基本数据类型。以基本数据类型int为例:packageday1119;publicclassTestBox{publicstaticvoidmain(String[]args){//自动装箱,底层其实执行了Integera=Integer.valueOf(1);Integera=1;//自动拆箱,底层其实执行了intb=a.intValue();intb=a;}}Integer的valueOf(inti)方法可以将一个基本数据类型转化为对应的包装类型,即装箱方法。而Integer的intValue()方法则可以将一个包装类型转化为对应的基本数据类型,即拆箱方法。
对于Integer的执行,下列两个输出的结果是什么?
正确答案是A答案是A这里要理解装箱类的new和直接赋值的区别,直接赋值是调用了valueOf方法,从valueOf方法的源码可以看到,当传入的值在缓存区的范围内,就会直接在缓存区取值,只有当传入的数值不在缓存区范围内,才会去new一个新的对象缓存区的范围是-128到127之间,100在缓存区内,所以直接在缓存区中取值,两个对象的引用是同一个,所以结果为true100是基本数据类型,赋值给包装类型,所以执行了自动装箱操作,自动装箱的操作就是调用的valueOf方法,而且数值在缓存区范围内,所以在缓存区内取数据,和上面的题一样,结果为true200是基本数据类型,赋值给包装类型,所以执行了自动装箱操作,自动装箱的操作就是调用的valueOf方法,但是200不在缓存区范围内,所以需要去new一个对象,两者的引用自然不同,结果为false
相关基本数据类型,以下表达式正确的是
正确答案是D需要对基本数据类型的长度范围有简单快速计算方法,比如D选项中的2147483648是整数最大值+1;byte型的最大正数为127,A错误;Boolean型是基本数据类型,不能赋值为null;0.9239默认为double类型,double赋值给float属于下行,需要加转化,一般加0.9239f;数字后面加L表明为long类型,float到long属于上行,自动变化。如果去掉L,则表明为整数,溢出。