先看几行代码
Integer a1 = 100;
Integer a2 = 100;
System.out.println("a1==a2:" + (a1 == a2));
Integer b1 = 200;
Integer b2 = 200;
System.out.println("b1==b2:" + (b1 == b2));
Integer c1 = new Integer(100);
Integer c2 = new Integer(100);
System.out.println("c1==c2:" + (c1 == c2));
int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));
a1==a2:true
b1==b2:false
c1==c2:false
d1==d2:true
大家的答案是否和显示的相同呢,如果和你想象的不同,那又是为什么会产生这种情况呢?
包装类型
这里我们重复什么是包装类型,什么是基本类型了。
包装类型的解释:
- 当我们对两个基本类型进行比较时,JVM是直接比较他们的他们的值
int a = 10;
int b = 10;
System.out.println(a == b);//true
- 当我们对两个包装类型比较时,JVM通过比较他们的地址来判断是否是同一个对象。例如下面的而例子,c1和c2都是new出来的新对象,因此c1==c2的值肯定不同,他们只是拥有相同value值的Integer对象。
Integer c1 = new Integer(100);
Integer c2 = new Integer(100);
System.out.println("c1==c2:" + (c1 == c2));//false
- 当我们对两个包装类型比较时,还有一种情况,就是不通过new来创建Integer,而是通过JVM自动把int基础类型转换成Integer对象(下面称为封包)。如以下例子:
Integer a1 = 100;
Integer a2 = 100;
System.out.println("a1==a2:" + (a1 == a2));//true
Integer b1 = 200;
Integer b2 = 200;
System.out.println("b1==b2:" + (b1 == b2));//false
为什么两个几乎一样的代码结果不同呢?让我们来看下JVM的指令操作:
In1.png从上图可以看出,在封包的过程中其实就是调用了Integer.valueOf()方法把int基本类型转换成了Integer对象。
public static Integer valueOf(int i) {
//IntegerCache.low=-128,IntegerCache.high=127
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在valueOf方法中对i进行了判断,如果在[-128,127]之间会从缓存中取出相应的Integer对象,而不是重新new一个Integer对象,所以当我们比较100的时候是返回的true,而200则是返回的是false。
- 当我们把一个Integer和一个int对象比较时,是通过从Integer取出value和int值比较
int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));
int2.png
网友评论