面向对象的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; }