包装类中的小注意

今天面试了一道Integer类的题,结果答案确不是自己想的那样,回来又进一步的学习了Integer类的相关知识。在平时不怎么注意的一些点,看后又涨知识了。

一、包装类

    1.1 使用

            在使用过程中,会涉及到自动装箱和自动拆箱

            装箱:将基本数据类转换成包装类

            拆箱:将包装类转换成基本数据类型

     1.2 举例

int a=10;
Integer i  = new Integer(a);

System.out.println(a==i);

 

上述将int类型转换成Integer类,即是我们说的装箱操作,结果为true。

同时,我们也可以使用方法将两者进行相互间的转换

//通过方法进行转换
int a=10;
Integer i1= Integer.valueOf(a);    //将int类型转换成Integer类

Integer i  = new Integer(a);
int i2=i.intValue();               //将Integer类转换成int类型

 

 

二、面试题

 

Integer i1 = 100;
Integer i2=100;
Integer i3=200;
Integer i4=200;
System.out.println(i1==i2);
System.out.println(i3==i4);

 

当时看完这道题,想着就是Integer是一个类,每次会在栈中新开辟一个地址存,所以i1~i4这4个变量的值的地址空间肯定不相等,所以输出结果均为false。最后将程序放到IDEA里一运行,i1==i2为true,i3==i4为false。

分析:

以下述i1为例,Integer i1=100;其实完成了两步操作,Integer类会对int类型进行一个装箱处理转换成包装类,而此时就使用到valueOf()方法,因此它又可以写成:

Integer i1 = 100;
=====》
int a = 100;
Integer i1= Integer.valueOf(a) //将int类型转换成Integer类

所以此时我只需要看看源码中valueOf()方法是怎么实现的就知道上述为什么结果不对。

private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];

.........
.........


public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
}

从valueOf()这个方法里可以知道 

if    -128<i<high
==》i1--100,i2--100;
    return  cache[ ]   

..... high=127
else i>high
==》i3--200,i4--200
i3,i4>127
   return new Integer(i)

所以最终结果:

i1==i2 为true  

i3==i4为false

三、补充

看完Integer类与int类型之间的转换后,我又想到要是其他包装类呢?Double、Float这些类又会怎样?

Double d1=1.0;
Double d2=1.0;
Double d3=2.0;
Double d4=2.0;
System.out.println(d1==d2);        // false
System.out.println(d3==d4);        // false

Double类之间的比较结果都为false,看源码一目了然

public static Double valueOf(double d) {
        return new Double(d);
 }

同理,Float包装类返回也是新new了一个对象。

 

posted @ 2020-11-27 12:00  豆小豆1314  阅读(128)  评论(0编辑  收藏  举报