一、内存引用知识
1.内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
2.int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
二、常见比较
2.1 int与Integer、new Integer()进行==比较时,结果永远为true
1.Integer与int比较时,Integer会有拆箱的过程,我们可以看看拆箱的代码:
@Override public int intValue(){ return value; }
直接返回的就是value,因此int与Integer以及new Integer()进行 ==比较时结果都是true。
2.2 Integer与new Integer()进行==比较时,结果永远为false
Integer a=n时,如果n大于等于-128小于等于127时,会直接从IntegerCache中取,不在这个范围内,会new一个对象,所以Integer与new Integer进行 ==比较时,结果都是false。
2.3Integer与Integer进行==比较时,看范围;在大于等于-128小于等于127的范围内为true,在此范围外为false。
Integer与Integer比较,需要看范围,如果在-128~127(包含-128,不包含127)范围内,因为都是从IntegerCache中取值,所以相等;若不在这个范围内,则都要去new一个对象,所以结果为false。
2.4 new Integer() 与 new Integer() 永远都是false
这是在堆内存中创建的两个不同的对象,不可能比较的地址相同的
三、代码总结
public static void main(String[] args) { // 1.int 与 任何类型 相比 都是 true int a1 = 127; Integer a2 = 127; System.out.println(a1 == a2); // true int a3 = 127; Integer a4 = new Integer(127); System.out.println(a3 == a4); // true int a5 = 128; Integer a6 = 128; System.out.println(a5 == a6); // true int a7 = 128; Integer a8 = new Integer(128); // true System.out.println(a7 == a8); // 2.Integer 与 Integer相比 127之间为true 大于就是false Integer a9 = 127; Integer a10 = 127; System.out.println(a9 == a10); // true Integer a11 = 128; Integer a12 = 128; System.out.println(a11 == a12); // false // 3.Integer 与 new Integer()相比 永远false Integer a13 = 127; Integer a14 = new Integer(127); System.out.println(a13 == a14); // false Integer a15 = 128; Integer a16 = new Integer(128); System.out.println(a15 == a16); // false }
true true true true true false false false