1.Integer 与 int的区别
1)、Integer 是int的包装类(相当于引用数据类型),int是8种基本数据类型之一。
2)、Integer的默认值是nul;int默认值是0。
2.Integer与int的比较 常见的 == 地址的比较
1)、Integer 是一个引用类型,实际上是要有一个Integer对象的,所以通过new产生的两个Integer变量永远是不相等的,new的两个地址是不一样的。
Integer a = new Integer(10); Integer b = new Integer(10); System.out.println(a == b);//false,两个new出来的对象地址一定不同
2)、Integer与int比较时,会有一个自动拆箱的过程。因为Integer类型与基本数据类型int比较时,java会将Integer自动拆箱成int类型比较,所以两个的值相等的时候,就视为相等的。(注意:非new产生的Integer跟new产生的Integer都会自动拆箱)
int a = 10; Integer b = 10; Integer c = new Integer(10); System.out.println(a == b);//true,非new的Integer自动拆箱成int System.out.println(a == c);//true,new的Integer也会自动拆箱成int
3)、两个非new产生的Integer比较。(有坑有陷阱)。这里在一定的范围内(-128--127)两个非new的Integer的变量只要值相等,比较结果就是true,这是Integer包装类的缓存机制,这个范围的上限可以更改(只有Integer的范围可以更改)其他包装类的范围是固定的不能更改。
(坑:)如果超过了这个范围(-128---127),那么会重新给你返回一个新的Integer。两者都new Integer();那地址肯定不同。
Integer b = 10; Integer c = 10; System.out.println(b == c);//true 在缓存范围之内 没有问题 Integer d = 150;//实际上是调用valueOf方法。在这方法中就有范围,-128-127才可以缓存 Integer e = 150; System.out.println(d == e);//flase超出了缓存范围,两个就都new Integer(150),肯定不等
源码:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
4)、非new产生的Integer与new 产生的Integer比较。非new产生的Integer变量指向的是java的常量池中的对象,而new产生的是在堆中创建的对象。两者地址肯定不同。
Integer a = 10;//指向java常量池中的对象 Integer b = new Integer(10);//指向堆中的对象 System.out.println(a == b);//flase 两者地址不同