代码示例:
package com.yue.Integer;
public class IntegerTest {
public static void main(String[] args) {
Integer a1 = new Integer(100);
Integer a2 = new Integer(100);
System.out.println(a1 == a2);
Integer b1 = 100;
Integer b2 = 1000;
Integer b3 = 100;
Integer b4 = 1000;
System.out.println(b1 == b3);
System.out.println(b2 == b4);
System.out.println(b1 == a1);
int c = 100;
System.out.println(c == a1);
System.out.println(c == b1);
}
}
/*
* false
* true
* false
* false
* true
* true
*/
代码解析:
1.两个new生成的Integer对象比较。
由于Integer实际是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相同的,因为New生成的是两个不同的对象,其内存地址不同。
Integer a1 = new Integer(100);
Integer a2 = new Integer(100);
System.out.println(a1 == a2); // false
2.非new生成的Integer对象比较。
Integer有缓存机制,区间在-127~128的比较结果为true,否则为false。
Integer b1 = 100;
Integer b2 = 1000;
Integer b3 = 100;
Integer b4 = 1000;
System.out.println(b1 == b3); // true
System.out.println(b2 == b4); // false
3.new生成的和非new生成对象比较
非new生成的Integer变量指向的是Java常量池中的对象,而new出来的对象指向的是堆中新建的对象,两者内存地址不同。
System.out.println(b1 == a1); // false
4.int和Integer比较
包装类Integer和基本数据类型比较的时候,java会自动拆箱为int,然后进行比较,实际上就是两个int变量进行比较
int c = 100;
System.out.println(c == a1); // true
System.out.println(c == b1); // true