"a <= b && b <= a && a!= b"怎么样?

Ada*_*dam 53 java autoboxing loops if-statement

这是代码,我必须弄清楚它是如何可能的.我有一个线索,但我不知道该怎么做.我认为它是负数和正数,也可能是变量修饰语.我是初学者,我到处寻找解决方案,但我找不到任何可用的东西.

问题是:你需要声明并初始化这两个变量.if条件必须为true.

代码:

if( a <= b && b <= a && a!=b){
       System.out.println("anything...");
}
Run Code Online (Sandbox Code Playgroud)

我很感谢你抽出时间.

Hen*_*nry 97

对于原始类型,这是不可能的.您可以使用盒装整数来实现它:

Integer a = new Integer(1);
Integer b = new Integer(1);
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案是对的; 他没有使用自动拳击.当然,`new`运算符可以保证创建一个新对象(或者无法正常返回). (17认同)
  • 新功能中的这些细微之处拴在了Java 5上,这太可怕了......这有什么潜在的错误. (6认同)
  • @Thilo有一个原因,他们被称为微妙之处.我不认为上述微妙之处有任何问题. (5认同)
  • 由于内部的"IntegerCache",这不起作用.初始化为128,你是正确的. (4认同)
  • @Thilo同意,如果你确切知道自己在做什么,自动装箱和开箱即可. (2认同)
  • 这些细微之处可以很容易地避免:只要不关心数值的任何地方使用`Integer`:使用`int`.当你需要*一个`Object`时,只使用`Integer`. (2认同)

eri*_*son 20

这也有效:

Integer a = 128, b = 128;
Run Code Online (Sandbox Code Playgroud)

这不是:

Integer a = 127, b = 127;
Run Code Online (Sandbox Code Playgroud)

自动装箱是int一种语法糖,用于调用Integer.valueOf(int).此函数使用缓存小于128的值.因此,128的赋值没有缓存命中; 它Integer为每个自动装箱操作创建一个新实例,并且a != b(引用比较)为真.

127的赋值具有缓存命中,并且结果Integer对象实际上是来自缓存的相同实例.因此,参考比较a != b是错误的.

  • 应该注意的是,规范中没有指定缓存内容的*exact*边界. (5认同)

Pet*_*der 13

类变量的另一种罕见的情况下可能是另一个线程可以改变的值a,并b同时比较执行.