记录自己做题时候遇到的坑。
Integer i01=59;
int i02=59;
Integer i03=Integer.valueOf(59);
Integer i04=new Integer(59);
以下输出结果为false的是:
System.out.println(i01==i02);
System.out.println(i01==i03);
System.out.println(i03==i04);
System.out.println(i02==i04);
知识点:
一、Integer与new Integer不会相等,不会经历拆箱过程。
二、两个都是非new出来的Integer,如果数值在-128到127之间,则是true,否则为false。java在编译Integer i2 = 128 的时候,被编译成Integer i2=
Integer.valueOf(128),而valueOf()函数会对-128到127进行缓存。
三、两个都是new出来的,都为false。
源代码:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
总结
- Integer是引用类型,int是原生数据类型。
2 . 对Integer对象,JVM会自动缓存-128~127范围内的值,所以所有在这个范围内的值相等的
Integer对象都会共用一块内存,而不会开辟多个;超出这个范围内的值对应的Integer对象有多
少个就开辟多少个内存。- 类型转换
1) Integer与int类型的赋值
a.把Integer类型赋值给int类型。此时,int类型变量的值会自动装箱成Integer类型,然后
赋给Integer类型的引用,这里底层就是通过调用valueOf()这个方法来实现所谓的装箱的。
b.把int类型赋值给Integer类型。此时,Integer类型变量的值会自动拆箱成int类型,然后
赋给int类型的变量,这里底层则是通过调用intValue()方法来实现所谓的拆箱的。
2) Integer与int类型的比较
这里就无所谓是谁与谁比较了,Integer == int与int == Integer的效果是一样的,都会把
Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。同样,拆
箱调用的还是intValue()方法。