Java中1000不等于1000的问题(Interger和int⽐较)
⽬录
⼀、⼩案例:
分别⽐较两个int类型的100数值⼤⼩和两个Integer类型的1000数值⼤⼩。
1.1测试数据如下:
int a = 100;
int b = 100;
System.out.print(a == b); //true
Integer c = 1000;
Integer d = 1000;
System.out.print(c == d); //false
1.2结论
java在编译Integer i = 1000 ;时,会翻译成为Integer i = Integer.valueOf(1000);,⽽java API中对Integer类型的valueOf的定义如下:
public static Integer valueOf(int i){
if (i >= IntegerCache.low && i <= IntegerCache.high){
return IntegerCache.cache[i + (-IntegerCache.low)];java valueof
}
return new Integer(i);
}
java对于-128到127之间的数,会进⾏缓存,在上述valueof()⽅法中,IntegerCache.low  = -128,IntegerCache.high  = 127 ,所以,Integer 的值在(-128 ~ 127)之间时,直接返回缓存中的值,当Integer的值⼤于127或者⼩于-128时,就会返回new的对象,故案例中的两个1000是new的两个对象,故返回false。
⼆、知识扩展
2.1 Integer和int的区别
Integer是int的包装类,int是Java的基本数据类型;
Integer变量必须实例化后才能使⽤,⽽int变量不需要;
Integer实际是对象的引⽤,当new⼀个Integer时,实际上是⽣成⼀个指针指向此对象;⽽int则是直接存储数据值;
Integer的默认值是null,int的默认值是0。
2.2 Integer和int的案例⽐较
2.2.1两个new Integer()的⽐较
Integer a = new Integer(100);
Integer b = new Integer(100);
System.out.print(a == b); //false
因为new⽣成的是两个对象,其内存地址不同,故结果为false。
2.2.2new Integer()和int的⽐较
Integer a = new Integer(100);
int b = 100;
System.out.print(a == b); //true
包装类Integer和基本数据类型int⽐较时,java会⾃动拆包装为int,然后进⾏⽐较,实际上就变为两个int变量的⽐较,故结果为true。2.2.3Integer缓存和new Integer的⽐较
Integer a = new Integer(100);
Integer b = 100;
System.out.print(a == b); //false
Integer b= 100 时,会翻译成为Integer b = Integer.valueOf(100) ,⽽100在(-128 ~ 127)区间内,故返回的是缓存池的数据;⽽new Integer()⽣成的变量指向堆中新建的对象,故a和b在内存中的地址
不同,故结果为false。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。