3

我从一本没有解释结果的 Java 书中得到以下代码。我运行它并得到了以下内联的结果,但我需要帮助理解结果:

1. Integer i = -10;
2. Integer j = -10;
3. System.out.print(i==j);  //  ==> true
4. System.out.print(i.equals(j));   //  ==> true
5. Integer n = 128;
6. Integer m = 128;
7. System.out.print(n==m);  //  ==> false
8. System.out.print(n.equals(m));   //  ==> true

我的问题是:

  • 为什么第 3 行解析为真?它们不是两个独立的对象吗?
  • 如果第 3 行是真的,为什么第 7 行不是真的?

谢谢,如果提前。

4

4 回答 4

9

Integer.valueOf(int i)源代码。

它缓存(使用整数池)-128 和 127 之间的整数(这些是默认值,可以通过自定义java.lang.Integer.IntegerCache.high

于 2012-12-02T19:08:07.387 回答
2

为了强调使用整数导致的荒谬程度==,请考虑以下行:

Integer a = 200, b = 200;
System.out.println(a < b || a == b || a > b);

显然,无论值如何,这都应该打印true,因为它看起来像重言式。它打印false,当然。以下,显然是同类型的重言式,打印期望值true

System.out.println(a <= b || a > b);
于 2012-12-02T19:19:21.467 回答
0

Integer是一个对象,而int是一个“标量”。像Integer i = 270;,在被子下,变成了Integer i = Integer.valueOf(270);。因此,当您创建两个Integer对象时,它们是不同的(如 所示==)。

但是,JDK 在valueOf中缓存了Integer具有较小值(-128 到 127)的对象的创建,如果可用,可以重用这些对象的先前版本。因此,两个明显不同的 small 实例Integers实际上可能是相同的,尽管它们似乎是分别实例化的。

int如果您尝试使用值进行相同的操作,则==比较总是正确的,并且equals()调用会产生编译错误(因为int不是对象)。

于 2012-12-02T19:25:54.947 回答
0

关于问题 1

根据doc,一个 Integer 类被包装在一个原始值周围,这仅仅意味着您可以期望该对象在需要时表现为一个原始值(在步骤 3 中执行的比较),并且在需要时同样作为一个对象(步骤4;如果使用int而不是Integer类,则无法执行此步骤。)。
如果您将步骤 1 和 2 中的类型交换为String而不是 Integer,并再次执行测试,您将获得您希望获得的预期结果。

关于问题 2

上面已经回答了:特定范围(-128 和 127)内的整数被缓存。

希望这可以帮助。

于 2012-12-02T19:27:35.367 回答