Java面试基础篇(数据类型)

Java面试基础篇(数据类型)

一、八种基本数据类型以及其对应的包装类

-原始基本数据类型(对应字节数):boolean(true/false),char(\u0000-\uffff),byte(1),short(2),int(4),long(8),float(4),double(8).
-对应包装类:
Boolean,Character,Byte,Short,Integer,Long,Float,Double

自动装箱(Auto-Boxing)与自动拆箱(Unboxing)

常见的面试题(一):
Java面试基础篇(数据类型)_第1张图片输出结果出乎我的意料:Java面试基础篇(数据类型)_第2张图片
查看源码发现在Integer类中调用了IntegerCache类的cache属性,其主要作用是:**对于Integer如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。**所以由此可见上面i2直接是调用的i1的对象引用,导致第一条输出语句的判断结果为true,而i3和i4在创建时因为数值大于127,使得他们各自创建了新的Integer对象,最终的结果导致了第二条输出语句结果为false。但是Double类型的对象创建是直接new出一个新的对象。

常见的面试题(二):
Java面试基础篇(数据类型)_第3张图片
这两行代码是完全合法的,完全能够通过编译的,但是在运行时,就会抛出空指针异常。其中,integer100为Integer类型的对象,它当然可以指向null。但在第二行时,就会对integer100进行拆箱,也就是对一个null对象执行intValue()方法,当然会抛出空指针异常。所以,有拆箱操作时一定要特别注意封装类对象是否为null。[^1]

自动装箱(Auto-Boxing)

同时,从上面的代码中,大家可以得知,i为一个Integer类型的引用,后面的数值为Java中的基础数据类型。而这种直接将一个基础数据类型传给其相应的封装类(wrapper class)的做法,便是自动装箱(Autoboxing)。
在jdk 1.5中,自动装箱首次被引入。而在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要这样做:

Integer i=new Integer (100);

拆箱(Unboxing)

直接上代码:
Java面试基础篇(数据类型)_第4张图片
在这里插入图片描述
从上面代码得知,integer_i为Integer类型的一个引用,而int_i为一个int类型的原始数据,但是我们可以将一个Integer类型的对象赋值给其相应原始数据类型的变量。这便是拆箱。
拆箱与装箱是相反的操作。装箱是将一个原始数据类型赋值给相应封装类的变量。而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。装箱、拆箱的名字也取得相当贴切。

**

拓展

案例一:
Java面试基础篇(数据类型)_第5张图片
输出结果为true,说明通过==比较,Integer类拆箱。

案例二:
Java面试基础篇(数据类型)_第6张图片
输出结果为:true.说明int基本数据类型装箱。

案例三:
Java面试基础篇(数据类型)_第7张图片
输出结果为:
在这里插入图片描述
说明:如注释所说,第一条输出语句,integer100+int100会得到一个类型为int且value为200的基础数据类型b,再将b进行装箱得到o,执行这个对象的toString()方法,并输出”200”;
第二条输出语句,integer100+int100会得到一个类型为int且value为200的基础数据类型b1,== 运算将long200进行拆箱得到b2,显然b1==b2,输出true;
第三条输出语句,integer100+int100会得到一个类型为int且value为200的基础数据类型b,Long的equals方法将b进行装箱,但装箱所得到的是类型为Integer的对象o,因为o与long200为不同的类型的对象,所以输出false;[^1]

以上所有内容,包含自己的理解以及转载部分博主的资料整理而成,如有任何建议,欢迎各位小伙伴指出并在留言区评论交流

Reference
[1]: Java自动装箱与拆箱及其陷阱:(https://blog.csdn.net/JairusChan/article/details/7513045)

你可能感兴趣的:(Java面试基础篇(数据类型))