int是基本数据类型;
Integer是int的包装类,是一个类。
例如
/** * Created by Poldi on 2017/7/5. */public class IntegerAndint {
public static void main(String[] args) {
int i1 = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i1==i2);//true 1
System.out.println(i1==i3);//true 2
System.out.println(i2==i3);//false 3
Integer i4 = 127;
Integer i5 = new Integer(127);
Integer i6 = new Integer(127);
Integer i7 = 127;
System.out.println(i4==i5);//false 4
System.out.println(i5==i6);//false 5
System.out.println(i4==i7);//true 6
Integer i8 = 128;
System.out.println(i2==i8);//false 7
int i9 = 127;
System.out.println(i4==i9);//true 8
}
}
在编译时,Integer i2=128的时候,被翻译成-> Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存,Integer.valueOf():
static final int low = -128;
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
- 1,2,8: int与Integer比较:Integer与int比较都会自动拆箱.int和integer比,值相同则是true,否则为false, 因为会把Integer自动拆箱为int再去比
- 3: (Integer 范围在-128-127内)new Integer 引用指向堆 ,Integer 指向专门存放他的内存(常量池)。他们的内存地址不一样,所以无论值是否相同,作比较结果都为false
- 4: Integer 范围不在-128-127,则编译的时候 Integer.valueOf(值)本质返回的是new Integer()
- 5: 两个都是new出来的,无论堆上的值是否相同,引用地址不同,结果为false
- 6,7: Integer 范围在-128-127内,值相同为true,值不同为false。Integer范围不在-128-127,编译的时候 Integer.valueOf(值)本质返回的是new Integer(),new Integer 引用指向堆。是两个不同的堆栈对象,无论堆上的值是否相同,引用地址不同,结果为false;