- int 和Integer在进行比较的时候,Integer会进行拆箱,转为int值与int进行比较。
- Integer与Integer比较的时候,由于直接赋值的时候会进行自动的装箱,那么这里就需要注意两个问题,一个是-128<= x<=127的整数,将会直接缓存在IntegerCache中,那么当赋值在这个区间的时候,不会创建新的Integer对象,而是从缓存中获取已经创建好的Integer对象。二:当大于这个范围的时候,直接new Integer来创建Integer对象。
- new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱。
实例演示:
情况一:
由此可知,int 类型 与 Integer, new Integer 类型的比较,就相当于int 类型与 int 类型之间的比较而已。
情况二:
a1 与 b1 的分析:
a1是自动装箱产生的Integer的对象,但是其大小超过了范围:-128<=A <=127,那么,这里会直接自己创建该对象即:new Integer(200);
a1和b1类似的原理。
显然这两个对象都是new出来,在堆中的地址值是不同的,那么==的时候判读其地址是不是相等,也就不一样了。
a2 与 b2 的分析:
由于2是在[-128,127]的区间以内,因此a2, b2 都会从IntegerCache中取,既然都是去IntegerCache中去取,那么自然该对象应该是一个对象,那么再堆中的地址应该是一样的,所以在判读两个对象是不是== 的时候,会输出true。
情况三:
a3 与 b3 的分析:
a3是自动装箱产生的Integer的对象,但是其大小超过了范围:-128<=A <=127,那么,这里会直接自己创建该对象即:new Integer(1000);
b3又重新创建了Integer对象的实例,开辟了新的空间,因此有新的地址。
因此,a3和b3都是Integer的对象。存储在堆中,分配的地址不同,在使用==进行判读的时候,由于双方都是对象,所以比较对象的地址是不是相同,这里的地址是不同的,因为new的时候会在堆中重新分配存储空间。
a4 与 b4的分析:
b4 是创建的一个Integer的对象,取值是1.
a4 是进行自动装箱后生成的Integer的对象,其值-128<= a4 <= 127,所以在这里会与第一种情况有所不同,这个a4对象直接取缓存IntegerCache中的对应的对象,当然了也是对象。
那么b4和a4也都是对象咯,而且一个是缓存中的,一个自己new的,既然是对象那么==会比较其地址,因为都new出来的对象(一个是自己new出来的,一个是IntegerCache中new出来的对象),那么自然这两种情况下,在堆中分配的地址是不同的。
文章转载自
作者:低调的样仔,《Java 的Integer、int与new Integer到底怎么回事?》