首先int和integer有是区别,是个人都知道integer是int的封装类,int是java 的一个基本数据类型,是一个关键字。
然后可能还会有人说int默认是0,integer对象默认是null,这有一个前提,那是作为类的成员,如果你在一个方法中出现
int a;
system.out.print(a);编译不通过,a没有初始化。同样的integer也是这样,一定要注意这个前提。
接下里就是最重要的内容了
首先说明一下自动装箱和自动拆箱。
自动装箱:
integer a=7;
在执行这句话的时候其实执行的真正内容是integer a=integer.valueof(7),下面是这个方法
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之间的数会有一个缓存,那么这个时候integer将不会创建新的对象,直接获取现有在缓存中的对象,如果不再这个范围内那么将会new一个integer对象出来。总的来说自动装箱的意思就是integer a=7这句话不是显示的new一个对象,但是还是要创建为一个对象。
自动拆箱
将一个integre对象转化成int型。例如:
integer a=10;
int b=10;
system.out.print(a==b);//执行a==b的时候,a会有一个自动拆箱的过程,执行a.intvalue()返回一个int值再和b比较,然后就转化成基本数据类型的比较,此时就是值的比较,那么肯定最后的结果就是true。
注意的一点是==两边是基本数据类型,那么就是值的比较,如果是对象类型,那么就是比较对象的地址,这个是之前文章里有写道的。
上面提到的integer的缓存,就是在装箱的时候才会经过,如果直接new一个integer对象,不经过那个缓存的。
其他的包装类的缓存情况如下:
包装器:
- Boolean:(全部缓存)
- Byte:(全部缓存)
- Character(<= 127缓存)
- Short(-128 — 127缓存)
- Long(-128 — 127缓存)
- Float(没有缓存)
- Doulbe(没有缓存)
那么上面说这么多,就明白了很多见下面例子
public static void main(String[] args) { int i = 128; Integer i2 = 128; Integer i3 = new Integer(128); //Integer会自动拆箱为int,所以为true System.out.println(i == i2); System.out.println(i == i3); System.out.println("**************"); Integer i5 = 127;//java在编译的时候,被翻译成-> Integer i5 = Integer.valueOf(127); Integer i6 = 127; System.out.println(i5 == i6);//true,127在缓存区间,i5,i6是同一个对象 /*Integer i5 = 128; Integer i6 = 128; System.out.println(i5 == i6);//false 128不再缓存区间,128就是两个对象 */ Integer ii5 = new Integer(127); System.out.println(i5 == ii5); //false ii5是直接new一个对象,即使在那个缓存区间里,但是这里直接new,不会经过那个缓存。
Integer a = new Integer(12); Integer b = new Integer(12); System.out.println(a == b);//false 上面说了,直接new对象,那就是直接创建两个不同的对象。Integer i7 = new Integer(128); Integer i8 = new Integer(123); System.out.println(i7 == i8); //false }