几年前我曾经被问到这道面试题,但至今仍未找到答案。
为了创建一个无限循环,x和y应该是什么?
while (x <= y&& x >= y && x != y) {
}
我们尝试使用Nan
、infinity+/-
和null
float
与int
之间的比较。
几年前我曾经被问到这道面试题,但至今仍未找到答案。
为了创建一个无限循环,x和y应该是什么?
while (x <= y&& x >= y && x != y) {
}
我们尝试使用Nan
、infinity+/-
和null
float
与int
之间的比较。
你需要两个可比较的变量,它们具有相同的值,但代表不同的实例,例如:
Integer x = new Integer(0);
Integer y = new Integer(0);
x <= y
和 y <= x
都是正确的,因为Integer
被取消封箱了,但实例相等性 x == y
是错误的。
请注意,这也适用于 Float
、Long
和 Double
,而且任何值(不仅仅是 0)都可以工作。
您还可以玩玩您的 JVM 的复杂性 - 它们通常只缓存整数到 127,所以这也可以工作:
Integer x = 128;
Integer y = 128;
但是它不适用于127。
更简单地说,由于Double
通常根本没有被缓存:
Double x = 0d;
Double y = 0d;
<=
和 >=
相比,该操作可以进行比较,而它们仅是原始包装器(不包括布尔类型)。 - Bernhard BarkerInteger x = 1; Integer y = 1;
中,x
和y
是相同的(缓存)实例。使用new
创建整数时,每次都会返回一个新实例。 - assyliasInteger.valueOf
或者自动装箱",我也应该在第一个 new Integer
上加上反引号。教训是:不要在iPad上一大早就评论SO帖子。 ;) - yshavitInteger
的JVM细节。但我不明白为什么Double
根本没有被缓存。你能解释一下吗? - Geek127d
可能并不比0.123d
经常使用。而1-127(int)是相当常见的(ASCII)... - assylias你需要创建两个整数对象,例如:
Integer x = new Integer(2);
Integer y = new Integer(2);
x
和y
是对象而不是基本类型,所以会导致无限循环。就是这个。
Integer x =1;
Integer y = new Integer(1);
while(x <= y&& x >= y && x != y) {
System.out.println("Success");
}
y = new Integer(x);
。 - Shark
x
和y
在数值上相等,<=
和>=
就会互相抵消,但是x==y
是一个引用检查,因此即使按值相等,两个实例在x!=y
上也会返回 true。 - Shark