2012-07-31 82 views
0

家伙的性质变有谁能够解释我的新的这种性质和使用使用采用新的与正常decleration和Integer(装箱/拆箱)

Integer i = new Integer(-10); 
Integer j = new Integer(-10); 
Integer k = -10; 
Integer l=-10; 
System.out.println(i==j); 
System.out.println(k==l); 

答案的整数声明是假的真

接下来

Integer a=128; 
    Integer b=128; 
    Integer c=127; 
    Integer d=127; 
    System.out.println(a==b); 
    System.out.println(c==d); 

答案越来越虚假。 任何人都可以解释这种性质。 在此先感谢:)

回答

2

在你的第一个例子,你总是创建新Integer对象和ij分配这些引用。对于kl你正在使用自动装箱,其中有时创建新的对象和有时没有。

在你的第二个例子中,你是只是使用自动装箱 - 但具有不同的值,这表明从上面“有时”。

section 5.1.7 of the JLS

如果被装箱值p为真,假,字节,或在范围\ u0000的一个char到\ u007f,或-128和127之间int或短号码(含),那么让r1和r2是p的任何两次装箱转换的结果。 r1 == r2总是如此。

理想情况下,装箱给定的原始值p将始终产生相同的参考。实际上,使用现有的实现技术可能不可行。上述规则是务实的妥协。上面的最后一个条款要求某些常用值总是被装入不可区分的对象中。实现可能会缓存这些,懒惰或热切。对于其他值,该公式不允许对程序员的盒装值的身份进行任何假设。这将允许(但不要求)分享部分或全部这些参考文献。

这可以确保在大多数情况下,行为将成为所需的行为,而不会对性能造成不必要的损失,特别是在小型设备上。例如,内存限制较少的实现可能会缓存所有char和short值,以及-32K到+ 32K范围内的int和long值。

+0

先生你是什么意思,有时会创造新的对象,有时它不? ,在第二个例子中,如你所说的范围事件,即-128到127,结果r1 == r2将是真的,很好。但是,它们的值是128,而它们是相同的,但它们的值是否为假? – 2012-07-31 08:42:58

+0

@GursahibSahni:你是否阅读过JLS的这一部分?我认为这很清楚。基本上有一个“小”整数的预定义值的缓存 - 这些将用于拳击小整数,但装箱较大的值将创建一个新的对象,每次。 – 2012-07-31 08:58:33

+0

先生,所以你试图说,每次创建一个新的对象时,对于大整数,因此结果是一个FALSE值? – 2012-07-31 10:03:01