这个'if'评估在Java中有三个同时表达式

Jho*_*nny 45 java

我在Java测试中遇到了这个问题,我必须为其分配值a,b因此该表达式的计算结果为true:

(a<=b && b<=a && a!=b)
Run Code Online (Sandbox Code Playgroud)

可悲的是,我不知道答案是什么.

Men*_*ena 79

这里有一个简单的技巧.

你不能只考虑布尔逻辑.使用它,这个组合......

  • a小于或等于b,和
  • b小于或等于a,和
  • a 不等于 b

......永远不会回来true.

但是,!=如果操作数是对象,则运算符会比较引用.

那么,以下将返回true:

Integer a = 1;
Integer b = new Integer(1);
System.out.println(a<=b && b<=a && a!=b);
Run Code Online (Sandbox Code Playgroud)

这里发生的是:a因为对象引用不等于b对象引用,尽管它们当然具有相等的整数值.

  • @OldCurmudgeon - 他正在使用`new Integer(1);`它不会从本地缓存返回值(与`Integer.valueOf()`不同).所以我觉得很好:) (15认同)
  • @Mena对这些事情的了解是必要的但不足以回答这个问题,特别是考虑到它依赖于通常不赞成的行为(比较使用`!=`的引用).如果我向某人展示答案并要求他们发现这个错误,我会非常期待他们找到它; 但反过来说,呈现看似错误的行为,并要求某人创建触发它的坏代码......这对我来说似乎没那么有用.YMMV,我想.:) (7认同)
  • @OldCurmudgeon即将回答,但ThwLostMind打败了我.显式初始化`new Integer(int value)`defiles interning. (3认同)
  • @JörgWMittag见[15.20.1](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.20.1):*"......操作数.. .必须...可转换为原始数字类型"*for` <=`和`> =`,以及[15.21.3](https://docs.oracle.com/javase/specs/jls/se8/ html/jls-15.html#jls-15.21.3),*"... = =的结果是真的,如果...都引用同一个对象"*为`==` (3认同)
  • 我试图在JLS中找到一个段落,保证这有效,但我没有运气......也没有能够确定它*不*.有人有报价吗? (2认同)
  • @yshavit我不得不在这里不同意你的观点.这*看起来像一个有趣的技巧,但它也意味着要了解Java语言的一些基础知识,很少有人费心去研究 - 这里,`Number`包装类,缓存和对象相等.例如,在甲骨文的1Z0-804考试中,我不会惊讶地发现这样的问题. (2认同)