有趣的事情。定义这两个变量以获得无限循环?

时间:2014-03-09 22:26:15

标签: java variables

我不知道解决这个问题,k和我会是什么类型的?

while (k<=i && i<=k && k!=i){
}

2 个答案:

答案 0 :(得分:5)

Integer i = 128;
Integer k = 128;

由于自动装箱,这些将是两个不同的对象。 i <= kk <= i都将为真,因为对象将被取消装箱,但i != k也将为真,因为==!=不会触发取消装箱。

但为什么他们是不同的对象?好吧,JLS需要integers between -128 and +127 are cached。在该范围之外,您通常会获得不同的对象。如果您将其更改为127而不是128,则ik都会引用相同的Integer对象。

实际上,从技术上讲,Java实现在该范围之外缓存其他值是合法的,因此您的里程可能会有所不同。一个防弹示例将显式创建两个对象,但我喜欢顶部代码的意外因素。

Integer i = new Integer(128);
Integer k = new Integer(128);

答案 1 :(得分:1)

使用自动装箱,==!=会比较参考。但是,<= < >>=会比较未装箱的内容值。

e.g。

Long i = -129;
Long k = -129;

使用Integer作为示例的问题是自动装箱缓存何时变化的上限。它至少是-128到127但可能要高得多。例如-XX:+AggressiveOpts可能是10000或20000.这意味着

Integer i = 128;
Integer k = 128;

取决于JVM的调整方式,可能是也可能不是解决方案。


我能想到的最接近的是BigDecimal,其中0.0等于0.00为false,但0.0 compareTo 0.00为0。

您必须将代码编写为

while(k.compareTo(i) <= 0 && i.compareTo(k) <= 0 && !k.equals(i)) { }

对于某些BigDecimal值,这可能是一个无限循环。

使用Java工作的两个显然不可能的数学例子是

while(x != 0 && x == -x) { }

while(x != x + 0) { }

x有许多无限循环的解决方案;)