由Integer封装与拆箱引申出的java面试题
2016-08-31 13:49
232 查看
Integer自动封装的陷阱
我们知道==运用于对象时,比较的是双方是否拥有同一个对象,而非简单的比较双方是否拥有相同的值,这里的abcd都是新建出来的对象,按理说都应该输入false才对。
但是道理其实很简单,我们去看下Integer这个类的源码就明白了其中的奥秘:
2. Integer自动拆箱机制
下面在看看这个例子:
看到这个答案很多小伙伴又会不解,先来说下第二个,Integer不是把-128至127缓存起来了吗?这不是应该是true嘛,但是你仔细看,这里的Integer是我们自己new出来的,并不是用的缓存,所以结果是false。 现在来看第一个为啥又是true了呢? 首先这里的值为1000,肯定和我们所知的Integer缓存没有关系。既然和缓存没有关系,a是新new出来的对象,按理说输入应该是false才对。但是注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。
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。
相关文章推荐
- Java学习之Integer封装与拆箱
- Integer自动封装拆箱
- Java中int和Integer的区别 Java的封装类和基础类
- 重踏学习Java路上_Day13(StringBuffer,Array与数组,Integer,Character,装箱,拆箱)
- java基本数据类型与封装类型详解(int和Integer区别)
- Java中Integer与int类型的装箱和拆箱
- Integer自动封装拆箱
- JAVA中基本数据类型和封装类的区别Integer和Double为例
- Java之BigInteger(面试题12:打印1到最大的n位数)
- 从i=i+1, i++, ++i 区别引申到JAVA装箱与拆箱
- Java中的基本类型与封装类型以及自动装箱、拆箱、String类型的解释
- Java 基本数据封装类自动装箱与拆箱
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较
- Java的String.valueOf 转换 与、空串+类型变量转换与封装类(Integer)的toString方式转换比较。
- java学习(4) int Integer 基本类型与封装类型的理解
- Java中Integer与int类型的装箱和拆箱
- 由字符串反转(使用递归)引申出来一道Java面试题
- 由字符串反转(使用递归)引申出来一道Java面试题
- 一道关于Java中Integer缓冲区的面试题
- java中尽量使用integer等封装类型,除非是计算少用基本类型