面向对象的Java,为了编程的方便为每一个基本数据类型都引入了对应的包装类型,提供了拆箱和装箱的语法糖,而int的包装类就是Integer。
一、基本区别
Ingeter是int的包装类,int的初值为0,Ingeter的初值为null。
二、其他区别
public static void main(String[] args) {
int s=1;
Integer aInteger =1;
Integer bInteger =2;
Integer cInteger =3;
Integer dInteger =3;
Integer eInteger =127;
Integer fInteger =127;
Integer integer = new Integer(2);
Integer kinteger = new Integer(2);
Integer m=128;
Integer h=128;
Long gLong = 3L;
System.out.println(s==aInteger);//true
System.out.println(s==integer);//false
System.out.println(cInteger==dInteger);//true
System.out.println(eInteger==fInteger);//true
System.out.println(m==h);//false
System.out.println(integer==kinteger);//false
System.out.println(cInteger==(aInteger+bInteger));//true
System.out.println(cInteger.equals(aInteger+bInteger));//true
System.out.println(gLong==(aInteger+bInteger));//true
System.out.println(gLong.equals(aInteger+bInteger));//false
}
(1)上面第一行和第的输出结果说明int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
(2)第四行和第五行同样的类型,一个是127和127的比较,一个是128和128的比较,一个返回true,而一个却返回false,这是什么现象?其实两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。因为java在编译Integer i2 = 128的时候,被翻译成:Integer i2 = Integer.valueOf(128);而valueOf()函数会对-128到127之间的数进行缓存。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
(3)第六行结果返回false,是因为两个都是new出来的存放在堆中,比较的是内存地址,而内存地址不一样返回false。
(4)第七、八行结果都返回true,而九、十行的结果一个返回true,一个返回false,是因为包装类重写了equals方法,而非new的Integer常量则在常量池(在方法区),类型一样的可以直接比较值
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}