比较Java中的整数

时间:2012-12-02 19:06:08

标签: java

我从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 个答案:

答案 0 :(得分:9)

请参阅Integer.valueOf(int i)源代码。

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

答案 1 :(得分: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);

答案 2 :(得分:0)

Integer是一个对象,而int是一个“标量”。类似于Integer i = 270;的内容变为Integer i = Integer.valueOf(270);。因此,当您创建两个Integer个对象时,它们是不同的(如==所示)。

但是,valueOf中的JDK缓存{ - 1}}对象的创建,其值较小 - -128到127,如果可用,则会重复使用这些对象的先前版本。因此,两个显然不同的小Integer实例可能实际上是相同的,尽管它们似乎已经单独实例化。

如果您使用Integers值尝试相同的操作,int比较将始终为真,==调用将生成编译错误(因为equals()不是一个对象)。

答案 3 :(得分:0)

问题1

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

问题2

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

希望这会有所帮助。