包装类中的小注意
今天面试了一道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了一个对象。
你看,这时光,不急不缓,不前不后