如何使用“x <= y && x >= y && x != y”使循环无限?

23

几年前我曾经被问到这道面试题,但至今仍未找到答案。

为了创建一个无限循环,x和y应该是什么?

while (x <= y&& x >= y && x != y) {

}

我们尝试使用Naninfinity+/-null

floatint之间的比较。


x和y的类型是什么?它们是原始类型还是引用类型,还是可以是任何类型? - prashant
2
你想要同一个数字的两个实例。只要 xy 在数值上相等,<=>= 就会互相抵消,但是 x==y 是一个引用检查,因此即使按值相等,两个实例在 x!=y 上也会返回 true。 - Shark
9
YAUIQ - 另一个无用的面试问题。虽然有趣、甚至娱乐,我不反对把它放在这里以供娱乐和学习。但我认为它并不能帮助任何人评估面试者是一个好的程序员雇员。 - arcy
1
如何声明i和j以使其成为无限循环? - Martin Smith
请查看此链接,已经有答案了。link - mreaevnia
显示剩余2条评论
4个回答

37
你需要两个可比较的变量,它们具有相同的值,但代表不同的实例,例如:

你需要两个可比较的变量,它们具有相同的值,但代表不同的实例,例如:

Integer x = new Integer(0);
Integer y = new Integer(0);

x <= yy <= x 都是正确的,因为Integer被取消封箱了,但实例相等性 x == y 是错误的。

请注意,这也适用于 FloatLongDouble,而且任何值(不仅仅是 0)都可以工作。


您还可以玩玩您的 JVM 的复杂性 - 它们通常只缓存整数到 127,所以这也可以工作:

Integer x = 128;
Integer y = 128;

但是它不适用于127。

更简单地说,由于Double通常根本没有被缓存:

Double x = 0d;
Double y = 0d;

3
<=>= 相比,该操作可以进行比较,而它们仅是原始包装器(不包括布尔类型)。 - Bernhard Barker
1
Integer x = 1; Integer y = 1;中,xy是相同的(缓存)实例。使用new创建整数时,每次都会返回一个新实例。 - assylias
1
@assylias 是的,我应该说"Integer.valueOf 或者自动装箱",我也应该在第一个 new Integer 上加上反引号。教训是:不要在iPad上一大早就评论SO帖子。 ;) - yshavit
@assylias +1,提到了关于Integer的JVM细节。但我不明白为什么Double根本没有被缓存。你能解释一下吗? - Geek
1
@Geek 它在JLS中:如果被装箱的值p是true、false、一个byte或者一个char在\u0000到\u007f范围内,或者是一个int或short数字在-128到127(包括边界)之间,那么让r1和r2成为p的任意两个装箱转换的结果。总是有r1 == r2。 - 一个给定的JVM可以进一步缓存更多,但不是必需的。实际上,缓存双倍并没有太多意义:127d可能并不比0.123d经常使用。而1-127(int)是相当常见的(ASCII)... - assylias
显示剩余3条评论

5

你需要创建两个整数对象,例如:

Integer x = new Integer(2);
Integer y = new Integer(2);

因为xy是对象而不是基本类型,所以会导致无限循环。

2
你已经得到了答案,我只是想说一下我是如何得出相同的答案的。在普通世界中,这样的测试是没有用的,两个数字不可能像这样运作。所以这意味着它必须是一些Java特定的东西。
x和y可以是简单类型,这使得它立即变得不可能。
x和y可以是对象。但是哪些对象会使用<=或>=进行比较?只有“装箱”数字。因此答案很快就出来了。

0

就是这个。

Integer x =1;
Integer y = new Integer(1);
while(x <= y&& x >= y && x != y) {
    System.out.println("Success");
}

1
本可以再多做一点,声明 y = new Integer(x); - Shark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接