您的位置:首页 > 职场人生

由Integer封装与拆箱引申出的java面试题

2016-08-31 13:49 232 查看
Integer自动封装的陷阱

public class IntegerTest {

public static void main(String[] args) {

Integer a=1000,b=1000;
Integer c=100,d=100;

System.out.println(a==b);//false
System.out.println(c==d);//true
}

}


我们知道==运用于对象时,比较的是双方是否拥有同一个对象,而非简单的比较双方是否拥有相同的值,这里的abcd都是新建出来的对象,按理说都应该输入false才对。

但是道理其实很简单,我们去看下Integer这个类的源码就明白了其中的奥秘:

/**
* Returns an {@code Integer} instance representing the specified
* {@code int} value.  If a new {@code Integer} instance is not
* required, this method should generally be used in preference to
* the constructor {@link #Integer(int)}, as this method is likely
* to yield significantly better space and time performance by
* caching frequently requested values.
*
* This method will always cache values in the range -128 to 127,
* inclusive, and may cache other values outside of this range.
*
* @param  i an {@code int} value.
* @return an {@code Integer} instance representing {@code i}.
* @since  1.5
*/
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}


当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128至127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。


2. Integer自动拆箱机制

下面在看看这个例子:

public class IntegerTest {

public static void main(String[] args) {

Integer a = new Integer(1000);
int b = 1000;
Integer c = new Integer(10);
Integer d = new Integer(10);

System.out.println(a == b);//true
System.out.println(c == d);//false

}
}


看到这个答案很多小伙伴又会不解,先来说下第二个,Integer不是把-128至127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: