Java中具有三个同时表达式的'if'语句评估

44

我在Java测试中遇到了这个问题,必须为ab 赋值,以使得这个表达式能够评估为 true:

(a<=b && b<=a && a!=b)

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


3
ab 的类型是什么? - Tunaki
1
只要'a'和'b'相同,它们可以是任何数字包装器。 'Byte'、'Character'、'Integer'、'Long'、'Float'、'Double'作为'!='比较引用,但'<='比较未装箱的值。 - Peter Lawrey
1
如果你喜欢这个谜题,可以尝试一下 x != x + 0,它有三种可能的类型,以及 x == -x,它有22种可能的值/类型。 - Peter Lawrey
只有三个选项?你可能会认为等于NaN的floatdouble将使用破损的IEEE-754相等性,而字符串将在自身和一个以'0'结尾的新字符串之间进行引用比较。但是,任何包装类型的任何非空值都可以工作,不是吗? - supercat
2
这是一个多么糟糕的测试问题啊。希望它是一个高级课题。 - WW.
1个回答

78

这里有一个简单的技巧。

仅使用布尔逻辑无法解决此问题。使用此方法,以下组合...

  • 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);
在这里发生的是:a 作为一个对象引用与 b 作为一个对象引用不相等,尽管它们存储了相同的整数值。

15
他正在使用"new Integer(1);",这不像"Integer.valueOf()"那样从本地缓存返回值。所以我猜没问题 :) - TheLostMind
3
@OldCurmudgeon正要回答,但是ThwLostMind比我先一步。 明确初始化一个new Integer(int value)会定义整数池。 - Mena
3
请参考 15.20.1 中的说明,对于 <=>= 运算符,操作数必须可转换为基本数值类型。对于 == 运算符,请参考 15.21.3,当且仅当两个操作数引用同一个对象时,其结果为 true。 - Marco13
2
@yshavit 我不得不在这里反对你。这 看起来 像一个有趣的技巧,但它也意味着要了解一些 Java 语言的基础知识,很少有人去探究 - 在这里,Number 包装类、缓存和对象相等性。我不会感到惊讶,如果在 Oracle 的 1Z0-804 考试中出现这样的问题。 - Mena
7
了解这些知识对回答这个问题是必要但不足的,特别是考虑到这个问题涉及通常被看作是不好的行为(使用“!=”比较引用)。如果我向某人展示答案并让他们寻找错误,我非常希望他们能找到它;但相反,展示看似有缺陷的行为并要求别人创建触发该行为的坏代码……这对我来说似乎没那么有用。你的情况可能会有所不同。 :) - yshavit
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接