【问题标题】:how to declare i and j to make it be an infinite loop?如何声明 i 和 j 使其成为无限循环?
【发布时间】:2011-12-22 08:14:12
【问题描述】:
while( i <= j && i >= j && i != j) {}

如何声明 i 和 j 使其成为无限循环?

//这是我遇到的一个面试问题。

它在问 i 和 j 的声明是什么,让它永远为真。

而且我无法通过将 i 和 j 声明为数字类型来说明这一点。还有哪些类型可以满足?

【问题讨论】:

  • @DJClayworth “|| 版本”是什么意思?
  • @Alan,非常好的问题+1

标签: java infinite-loop


【解决方案1】:
Integer i=new Integer(1000);
Integer j=new Integer(1000);

System.out.println((i<=j)+" "+(i>=j)+" "+(i!=j));

ij 将自动拆箱为 &lt;=&gt;= 的整数,但不适用于 !=ij 是不同的实例,但具有相同的 int 值。这就是为什么所有三个比较都将返回 true 的原因。

【讨论】:

  • 很好,我认为这是正确的答案。至少它是真实的。//多么棘手的面试问题!!!
  • +1 i &lt;= j &amp;&amp; i &gt;= j &amp;&amp; i != j evaluates to true in this case then
  • +1 以获得准确的答案,但为什么 i 和 j 不会为 i!=j 拆箱? i!=j 不应该检查 i 和 j 的值吗?这还适用于哪些其他语言?
  • @SpeedBirdNine 否则不可能做到i!=null。有时您想比较实例而不是值。
  • 好问题和好答案!
【解决方案2】:

这也有效(“在我的机器上”):

Integer a = 128, b = 128;

而这不起作用:

Integer a = 127, b = 127;

自动装箱 int 是调用 Integer.valueOf(int) 的语法糖。此函数对从 -128 到 127 的值使用缓存,包括在内。它可能缓存其他值,但就我而言,它没有。

因此,128 的赋值没有缓存命中;它为每个自动装箱操作创建一个新的Integer 实例,并且参考比较a != b 为真。 127 的赋值有一个缓存命中,结果Integer 对象实际上是缓存中的同一个实例。所以,参考比较a != b 是假的。

我真正想指出的是要提防与自动装箱的参考比较。一个更可能的现实问题是您期望 a == b 为真,因为它们被分配了相同的(自动装箱)值,您运行一些单元测试来确认您的期望,然后您的代码在“野外”失败时某些计数器超过了缓存的上限。欢乐时光!

【讨论】:

【解决方案3】:

'i' 和 'j' 的任何相等值都将在给定语句中显示为真,例如:

Integer i = new Integer(1);
Integer j = new Integer(1);

while( i <= j && i >= j && i != j) {}

神奇之处在于使用过的运算符!在 != 运算符的情况下,编译器将操作数作为对象(包括它们的值),而在 >= 或

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多