我不知道解决这个问题,k和我会是什么类型的?
while (k<=i && i<=k && k!=i){
}
答案 0 :(得分:5)
Integer i = 128;
Integer k = 128;
由于自动装箱,这些将是两个不同的对象。 i <= k
和k <= i
都将为真,因为对象将被取消装箱,但i != k
也将为真,因为==
和!=
不会触发取消装箱。
但为什么他们是不同的对象?好吧,JLS需要integers between -128 and +127 are cached。在该范围之外,您通常会获得不同的对象。如果您将其更改为127而不是128,则i
和k
都会引用相同的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
有许多无限循环的解决方案;)