1

可能重复:
整数包装器对象仅在值 127 内共享相同的实例?

public class test
{
  public static void main(String args[])
  {
    Integer a1=127;
    Integer a2=127;
    System.out.println(a1==a2); //output: true

    Integer b1=128;
    Integer b2=128;
    System.out.println(b1==b2); //output: false

    Long c1=127L;
    Long c2=127L;
    System.out.println(c1==c2); //  output: true

    Long d1=128L;
    Long d2=128L;
    System.out.println(d1==d2); //output: false 
  }
}

输出:

true
false
true
false

您也可以使用负值。当您观察带有值的输出时,它们的行为会有所不同。产生这种不同结果的原因是什么?

对于任何数字,范围应为 -127 到 +127,然后==为真或为假。

(所有人)对不起,这是一个拼写错误,我错误地把它当作原始的,但它是抽象的。对不起这个错误。现在更正...

4

4 回答 4

9

整数不是原始的,它是一个对象。如果你用过int,否则long你只会得到true.

你得到这个结果的原因是整数被缓存在 -128 和 127 之间的值,所以Integer i = 127总是返回相同的引用。Integer j = 128不一定会这样做。然后,您将需要使用equals来测试底层的相等性int

这是在Java 语言规范 #5.1.7中定义的。

请注意,超出该范围的值的行为 [-128; 127]未定义:

例如,内存限制较少的实现可能会缓存所有 char 和 short 值,以及 -32K 到 +32K 范围内的 int 和 long 值。

于 2012-08-14T15:42:23.570 回答
1

Integer 不是原始类型,而是包装类型。请参阅:http ://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2012-08-14T15:42:16.647 回答
0

首先,整数不是基元(int 是)。但是要回答为什么会发生这种情况,这是因为在 Integer 实现中发现了一个内部缓存:

 /**
 * Cache to support the object identity semantics of autoboxing for values between 
 * -128 and 127 (inclusive) as required by JLS.
 *
 * The cache is initialized on first usage. During VM initialization the
 * getAndRemoveCacheProperties method may be used to get and remove any system
 * properites that configure the cache size. At this time, the size of the
 * cache may be controlled by the vm option -XX:AutoBoxCacheMax=<size>.
 */

因此,本质上,当您比较两个已缓存的整数时,您是在将同一个对象与其自身进行比较,因此 == 返回 true,但是当您比较高于 127 或低于 -127 的整数(非缓存整数)时,您正在比较两个不同的整数实例。

如果你使用 equals 或 compareTo 方法,你会得到期望看到的。

于 2012-08-14T16:09:27.770 回答
0

Integer是对象(包装类),而不是原始类型

最好进行比较,例如a1.intValue() == a2. intValue()instead (or) equals()

于 2012-08-14T15:42:11.647 回答