2013-09-27 131 views
51

这是我必须弄清楚它的代码怎么可能。我有一个线索,但我不知道该怎么做。我认为这是关于负数和正数,也可能是变量修饰符。我是一个初学者,我到处寻找解决方案,但我找不到任何可用的东西。如何“a <= b && b <= a && a!= b”为真?

问题是:你需要声明和初始化这两个变量。 if条件必须为真。

代码:

if(a <= b && b <= a && a!=b){ 
     System.out.println("anything..."); 
} 

我感谢您抽出宝贵的时间。

+1

对于'int',我不认为'if'评估为'真' –

+0

我不会感到惊讶,如果有浮点数的组合,这可以工作。 – Thilo

+0

我看着-0F和0F,但他们不会这样做。我认为亨利是预期的答案。 – erickson

回答

92

这对原始类型是不可能的。你可以用盒装整数实现它:

Integer a = new Integer(1); 
Integer b = new Integer(1); 

<=>=比较将使用未装箱的值1,而!=将比较引用,并会成功,因为它们是不同的对象。

+5

Java 5新特性中的这些微妙之处非常可怕......这对bug有什么潜在的影响。 – Thilo

+5

@Thilo他们被称为微妙之处是有原因的。我不认为上述微妙之处有什么不妥。 –

+2

@Thilo同意,如果你确切地知道你在做什么,自动装箱和复制只是方便的。 – Henry

20

这工作太:

Integer a = 128, b = 128; 

这不:

Integer a = 127, b = 127; 

自动装箱的int是到Integer.valueOf(int)呼叫语法糖。该函数使用缓存的值小于128.因此,128的分配没有缓存命中;它会为每个自动装箱操作创建一个新的Integer实例,并且a != b(参考比较)为true。

127的赋值有一个缓存命中,并且得到的Integer对象实际上是来自缓存的相同实例。所以,参考比较a != b是错误的。

+5

应该指出的是,规范中没有指定缓存内容的*确切*边界。 –

+1

@JoachimSauer根据规范,必须缓存区间[-128,127],例如,127会始终失败。超出该间隔*的值可能会被缓存,这会导致失败。 – erickson

11

类变量的另一个罕见情况可能是另一个线程可能在执行比较时更改ab的值。

相关问题