0%

Java中int与Integer用==比较详解

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void testEquals() {
int int1 = 12;
int int2 = 12;

Integer integer1 = new Integer(12);
Integer integer2 = new Integer(12);
Integer integer3 = new Integer(127);

Integer a1 = 127;
Integer a2 = 127;

Integer a = 128;
Integer b = 128;

System.out.println("int1 == int2 -> " + (int1 == int2));
System.out.println("int1 == integer1 -> " + (int1 == integer1));
System.out.println("int1 == integer2 -> " + (int1 == integer2));
System.out.println("integer1 == integer2 -> " + (integer1 == integer2));
System.out.println("integer3 == a1 -> " + (integer3 == a1));
System.out.println("a1 == a2 -> " + (a1 == a2));
System.out.println("a == b -> " + (a == b));
}

结果:

1
2
3
4
5
6
7
1、int1 == int2 -> true
2、int1 == integer1 -> true
3、int1 == integer2 -> true
4、integer1 == integer2 -> false
5、integer3 == a1 -> false
6、a1 == a2 -> true
7、a == b -> false

下面我们就来详细解释一下,为什么是上面的结果。(下面的序号就是对应的是上面的答案序号)

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
2
3
4
5
6
7
8
Integer a1 = 127;
Integer a2 = 127;

Integer a = 128;
Integer b = 128;

System.out.println("a1 == a2 -> " + (a1 == a2));
System.out.println("a == b -> " + (a == b));

这是因为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
2
3
4
5
6
7
public static Integer valueOf(int i){
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];
}
return new Integer(i);
}

因此Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了