我有一段代码:
public class Test{
public static void main(String args[]){
Integer a = 100;
Integer b = 100;
Integer c = 5000;
Integer d = 5000;
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
if(a == b)
System.out.println("a & b Both are Equal");
else
System.out.println("a & b are Not Equal");
if(c == d)
System.out.println("c & d Both are Equal");
else
System.out.println("c & d are Not Equal");
}
}
我不明白为什么输出是这样的?
Output
是:
a & b Both are equal
c & d are not equal
我正在使用jdk1.7
答案 0 :(得分:7)
这是由于虚拟机中的优化将小(常用)整数映射到重用的对象池。 This answer解释了一些细节。
答案 1 :(得分:4)
看起来java编译器正在使用Integer
对象的缓存值。仅为小的inetger值填充此缓存。值100在缓存中,因此重新使用该对象。 5000的值不在cahce中,因此每次都会创建新对象。
对象相等的==比较测试,而不是值相等因此,为什么缓存的对象被认为是相等的而其他的不是。
答案 2 :(得分:2)
您正在使用Integer
运算符比较==
个对象的地址,编译器必须简单地重复使用a
和{{1同一个变量但不是b
和c
对象的对象。如果使用d
方法测试相等性,那么您将获得所需的结果:
equals
答案 3 :(得分:0)
拳击转换 拳击转换将基本类型的值转换为引用类型的对应值。具体来说,以下8个转换称为装箱转换:
从类型布尔值到类型布尔值 从类型字节到类型字节 从类型char到类型字符 从短类型到短类型 从int类型到Integer类型 从类型long到类型Long 从类型float到类型Float 从double类型到Double类型 在运行时,拳击转换如下进行:
如果p是boolean类型的值,那么装箱转换将p转换为类的引用r并输入Boolean,这样r.booleanValue()== p 如果p是byte类型的值,那么装箱转换将p转换为类的引用r并键入Byte,这样r.byteValue()== p 如果p是char类型的值,那么装箱转换将p转换为类的引用r并键入Character,这样r.charValue()== p 如果p是short类型的值,那么装箱转换将p转换为类的引用r并输入Short,这样r.shortValue()== p 如果p是int类型的值,那么装箱转换将p转换为类的引用r并输入Integer,这样r.intValue()== p 如果p是long类型的值,那么装箱转换将p转换为类的引用r并输入Long,这样r.longValue()== p 如果p是float类型的值,则: 如果p不是NaN,那么装箱转换将p转换为类的引用r并输入Float,这样r.floatValue()的计算结果为p 否则,装箱转换将p转换为类的引用r并键入Float,使得r.isNaN()的计算结果为true。 如果p是double类型的值,那么 如果p不是NaN,则装箱转换将p转换为类的引用r并输入Double,这样r.doubleValue()求值为p 否则,装箱转换将p转换为类的引用r并输入Double,使得r.isNaN()的计算结果为true。 如果p是任何其他类型的值,则装箱转换等同于标识转换(5.1.1)。 如果被装箱的值p为true,false,一个字节,范围为\ u0000到\ u007f的char,或者介于-128和127之间的int或短号,则让r1和r2为任意两个装箱转换的结果p。始终是r1 == r2的情况 好读 - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7