繁体   English   中英

比较Java中的整数

[英]Comparing Integers in 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行不正确?

谢谢,如果提前。

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

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

要强调使用== on Integers导致的荒谬程度,请考虑以下行:

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

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

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

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

但是, valueOf的JDK缓存了具有较小值-128到127的Integer对象的创建,并且如果可用,则重用这些对象的先前版本。 因此,两个明显不同的小Integers实例可能实际上是相同的,尽管它们似乎已经单独实例化。

如果您使用int值尝试相同的事情,则== compare将始终为true,而equals()调用将生成编译错误(因为int不是对象)。

问题1

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

问题2

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM