本文主要是介绍java中自动装箱的变态小题目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Integer i1 = 100;
Integer i2 =100;
boolean b1 = i1== i2;//结果为true
Integer i3 =200;
Integer i4 =200;
boolean b2 = i3 == i4;//结果为false
完整代码:(编译器二次加工)
package cn.jdk.integer;public class IntegerTest {public static void main(String[] args) {Integer i1 = Integer.valueOf(100);Integer i2 = Integer.valueOf(100);boolean b1 = i1==i2;System.out.println("i1,i2是否是同一对象:"+b1);Integer i3 = Integer.valueOf(200);Integer i4 = Integer.valueOf(200);boolean b2 = i3==i4;System.out.println("i3,i4是否是同一对象:"+b2);}
}
这时你应该可以看到,疑团在Integer.valueOf()方法身上。传递给这个方法100时,它返回的Integer对象是同一个对象,而传递给这个方法200时,返回的却是不同的对象。这是我们需要打开Integer的源码(这里就不粘贴Integer的源代码了),查看它的valueOf()方法内容。
Integer类的内部缓存了-128~127之间的256个Integer对象,如果valueOf()方法需要把这个范围之内的整数转换成Integer对象时,valueOf()方法不会去new对象,而是从缓存中直接获取,这就会导致valueOf(100)两次,都是从缓存中获取的同一个Integer对象!如果valueOf()方法收到的参数不在缓存范围之内,那么valueOf()方法会new一个新对象!这就是为什么Integer.valueOf(200)两次返回的对象不同的原因了。
这篇关于java中自动装箱的变态小题目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!