面试官:你都工作两年了,这么基础的题目都能做错,亏你还做了那么多项目

作为一名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;
  }
}

反编译之后的结果如下:

面试官:你都工作两年了,这么基础的题目都能做错,亏你还做了那么多项目_第1张图片

从反编译的结果我们可以得知,在装箱的时候,调用了 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关键字的理解

更多惊喜,请长按二维码识别关注

你可能感兴趣的:(java,编程语言,object,面试,eclipse)