Java中int与Integer用==比较详解
int和Integer的区别
1、Integer是int的包装类,int则是java的一种基本数据类型
2、Integer变量必须实例化后才能使用,而int变量不需要
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4、Integer的默认值是null,int的默认值是0
先看一道例题判断 true 和 false
1 | public void testEquals() { |
结果:
1 | 1、int1 == int2 -> true |
下面我们就来详细解释一下,为什么是上面的结果。(下面的序号就是对应的是上面的答案序号)
1、int1 == int2 为true,
对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false
2,3、 “int1== integer1” 和 “int1 == integer2” 为true
Integer是int的封装类,当Integer与int进行 ==比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型(实际上就变为两个int变量的比较),所以就是相等的。
4、integer1 == integer2 -> false,
由于Integer变量实际上是对一个Integer对象的引用,因为new生成的是两个对象,其内存地址不同。这是两个都是对象类型,而且不会进行拆箱比较,所以不等。
5、integer3 == a1 -> false ,
非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是Java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)
6,7、看起来是一模一样的为什么一个是true,一个是false?
1 | Integer a1 = 127; |
这是因为Integer作为常量时,对于-128到127之间的数,会进行缓存,也就是说int a1 = 127时,在范围之内,这个时候就存放在缓存中,当再创建a2时,Java发现缓存中存在127这个数了,就直接取出来赋值给a2,所以a1 == a2的。当超过范围就是new Integer()来new一个对象了,所以a、b都是new Integer(128)出来的变量,所以它们不等。
关于Java对于-128到127之间的数,会进行缓存的具体解释:
例如Java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:
1 | public static Integer valueOf(int i){ |
因此Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了