1.Integer是int的包装类,int是Java的一种基本数据类型
延伸:Java中的基本数据类型:(1)四种整数类型:byte、short、int、long
(2)俩种浮点数类型:float、double
(3)一种字符类型:char
(4)一种布尔类型:Boolean(true、false)
2. Integer变量必须实例化以后才能使用,而int变量不需要
3.Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而int则是直接存储数据值
4.Integer默认值是null,int默认值是0
延伸:int类型变量和Integer类型变量比较,Integer类型变量之间比较
package test; public class IntegerTest { public static void main(String[] args) { Integer i = new Integer(5); Integer j = new Integer(5); System.out.println(i==j);//false:new生成的俩个对象的内存地址不同 int m = 5; Integer n = new Integer(5); Integer l = 5; System.out.println(m==n);//true:Integer变量和int变量比较时,Java会自动拆箱为int(n.intValue()),然后进行比较,所以只要俩个变量的值相等,比较结果就为true System.out.println(m==l);//true:理由同上 Integer x = 5;//java在编译的时候会翻译成Integer x = Integer.valueOf(5),即装箱为Integer对象 Integer y = new Integer(5); System.out.println(x==y);//false:非new生成的Integer变量指向的是常量池,new生成的Integer变量指向堆中新建的对象,俩者在内存中的地址不同,所以比较结果为false Integer p = 5; Integer q = 5; System.out.println(p==q);//true:自动装箱:对于从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用(这里面涉及到一种设计模式,叫享元模式),也就是说,其实此时p和q在内存中的地址是一样的,所以结果为true,而当相互比较的值大于127,他们在内存中的地址不会被共享,结果false. Integer a = 128; Integer b = 128; System.out.println(a==b);//false:俩个非new生成的Integer变量进行比较时,如果俩个变量在-127-128之间,则结果为true,否则为false,因为JDK源码的valueOf函数式这样的: /*public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } 对于-128到127之间的数,会进行缓存*/ } }
注:拆箱和装箱是JDK1.5版本新加的特性,之前的版本并不支持。
如果有错误的地方,还请指正。