作为一名java程序员,求职面试时,不知你有没有遇到,面试官提问的问题很简单,可自己却答错了。
有次,我到一家互联网公司应聘,公司前台妹子叫我先做一下笔试题,其中有一道题目是这样的:
public class IntegerTest {
public static void main(String[] args) {
Integer i = 10, j = 10;
Integer m = 600, n = 600;
System.out.println(i == j);
System.out.println(m == n);
System.out.println(m.equals(n));
}
}
请问程序结果输出什么,我不假思索地选择了
true
true
true
心里还想着,怎么出这么简单的题目,后来面试官看了笔试题后,说,你都工作两年了,我看你做的项目也不少,怎么这样的题目都做错了。说得我特别不好意思。
正确答案应该是:
true
false
true
其实这道题目无非就是考察两点,java装箱和拆箱的问题。
装箱 就是自动将基本数据类型转换为包装器类型;
拆箱 就是自动将包装器类型转换为基本数据类型
在电商平台中,商家寄快递,打包,这个操作我们叫做装箱,消费者买东西收到快递后拆包,叫拆箱,那么java程序中的装箱又是怎样的呢,下面我们来看看具体例子。
在程序中,如果我们需要生成一个数值的对象,可以这样使用
Integer a = 100; //装箱
这个过程就会根据数值创建对应的 Integer 对象这就是装箱
而拆箱呢,则可以这样
int b = a; //拆箱
这个时候就是拆箱操作。
或许上面的解析过于笼统,下面我们再写个例子来反编译一下,进一步验证下,看看整个过程调用了哪些方法。
public class IntegerTest {
public static void main(String[] args) {
Integer i = 100;
int j = i;
}
}
反编译之后的结果如下:
从反编译的结果我们可以得知,在装箱的时候,调用了 Integer 的 valueOf(int i) 方法;而在拆箱的时候,则调用了 Integer 的 intValue() 方法。
关于 Integer.valueOf方法,我们来看下它的源码
public static Integer valueOf(int i) {
if (i >= Integer.IntegerCache.low && i <= Integer.IntegerCache.high)
return Integer.IntegerCache.cache[i + (-Integer.IntegerCache.low)];
return new Integer(i);
}
通过源码可以看到,在 Interger 的 valueOf 方法中,如果数值在 [-127, 128] 范围的时候,就会去 IntegerCache.cache 这个数组寻找有没有存在的 Integer 对象的引用,如果有,则直接返回对象的引用,如果没有(超过了范围),就新建一个 Integer 对象。
现在我们再回过头来再看看文中开头的题目
Integer m = 600,n =600;
600不在这个 [-127, 128] 范围,所以我们用 == 程序就返回false 而用equals 这返回true 。
equals方法是这样定义的,先拆箱为int再比较
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
Integer装箱操作:例如 Integer i= 3;这种格式的代码,将编译成
Integer i=Integer.valueOf(3);
这就是装箱操作。Integer拆箱操作:在编译期将Integer转换成int类型,会调用int j = i.intValue()方法,拆箱操作在例子中表现为,int类型与Integer类型进行==比较,此时Integer会进行拆箱操作。
以上只是关于java装箱和拆箱的简单分析,由于笔者水平有限,文中纰漏之处在所难免,权当抛砖引玉,不妥之处,请大家批评指正。
-END-
作者:洪生鹏
技术交流、媒体合作、品牌宣传请加鹏哥微信: hsp-88ios
近期推荐
作为一名程序员,技术的广度与深度如何权衡
知名公司面试题:谈谈你对volatile关键字的理解
更多惊喜,请长按二维码识别关注