2011-11-22 56 views
5

我最好的代码片段:Integer类对象

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

+1

**当equals()为真时,对象**只有“相等”。使用'=='表示**引用**是相同的。 –

回答

7

这是由于小(常用)的整数映射到对象池被重复使用虚拟机的优化。 This answer解释了一些细节。

4

它看起来像java编译器使用Integer对象的缓存值。该缓存仅填充小的inetger值。 100的值在缓存中,因此该对象被重新使用。 5000的值不在cahce中,因此每次创建新对象。

==比较测试的对象相等,而不是值相等,因此为什么缓存的对象被认为是相等的,其他人不是。

+0

你的陈述能证明吗? –

+0

请更精确?哪些陈述需要证明? –

+0

你自己的代码就是证明。 –

2

你比较地址使用==运营商和编译器必须简单地重复使用相同的变量ab对象,但不是cd对象Integer对象。如果使用equals方法测试相等,则得到理想的效果:

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.equals(b)) 
      System.out.println("a & b Both are Equal"); 
     else 
      System.out.println("a & b are Not Equal"); 
     if(c.equals(d)) 
      System.out.println("c & d Both are Equal"); 
     else 
      System.out.println("c & d are Not Equal"); 
    } 
} 

100 
100 
5000 
5000 
a & b Both are Equal 
c & d Both are Equal 
0

拳击转换 拳击转换是转换原始类型的值,以对应的参考类型的值。具体而言,下列8的转换被称为装箱转换:

从布尔类型为类型布尔 从类型字节输入字节 从类型char键入字符 从类型短键入短 从int类型为类型整数 从型长键入龙 从类型浮子式浮球 从型双输入双 在运行时,装箱转换如下进行:

如果p是布尔类型的值,然后装箱转换转换p到类的参考r中,并输入Boolean,例如r.bo oleanValue()== p 如果p是字节类型的值,那么装箱转换将p转换为类的类型为Byte的引用r,使得r.byteValue()== p 如果p是char类型的值,然后装箱转换将p转换为类和字符的引用r,如r.charValue()== p 如果p是short类型的值,则装箱转换将p转换为类的引用r,并输入Short ,如r.shortValue()== p 如果p是一个int类型的值,那么装箱转换将p转换为类的一个引用r并且类型为Integer,例如r.intValue()== p 如果p是long类型的值,然后装箱转换将p转换为类型和类型Long的引用r,使得r.longValue()== p 如果p是float类型的值,则: 如果p不是NaN,则拳击转换ersion将p转换为类的类型和类型Float的引用r,这样r.floatValue()的计算结果为p 否则,装箱转换会将p转换为类的引用r,然后键入Float,使r.isNaN()的值为true。 如果p是double类型的值,则 如果p不是NaN,则装箱转换会将p转换为类的参考r并输入Double,以便r.doubleValue()的计算结果为p 否则,装箱转换会将p转换为类和类型Double的引用r,使得r.isNaN()的计算结果为true。 如果p是任何其他类型的值,则装箱转换等同于身份转换(5.1.1)。 如果正在装箱的值为真,假,一个字节,范围在\ u0000到\ u00f之间的一个字符,或者在-128到127之间的一个int或短数字,则让r1和r2是任意两个装箱的结果转换。它始终是这种情况r1 == r2 好阅读 - http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7

相关问题