如果(boolean == false)与if(!boolean)有什么区别?

40

6
更易读。 - Lukas Knuth
14
@Lukas Knuth 真的吗?我认为恰恰相反... - ateiob
相关:[在Java中明确与布尔常量进行比较是否有害,例如if(b == false)?](https://dev59.com/-nE85IYBdhLWcg3wr1ge) - BalusC
4
第一个例子一看就知道预期结果应该是false。而在后一个例子中,你只能猜测预期结果是什么。另外,很容易忽略感叹号。 - Torsten Walter
2
if (b==false) 更冗长且难以阅读。如果你想让它更加冗长,你可以使用 if (b == false == true == true)(来自 https://dev59.com/-nE85IYBdhLWcg3wr1ge) - Steve Kuo
1
如何使用 if(b != true) 来完成任务。作为一个有 C 语言背景的程序员,我更喜欢使用冗长的版本以获得更清晰的代码,但是(假设编译器不会优化掉它),冗长的方法会产生更多的处理:读取值一 读取值二 比较 根据输出进行处理,而不是 读取值 根据值进行处理 - Mark
7个回答

63

除了"可读性"之外,它们在功能上是等效的。

("可读性"被引号引起来是因为我讨厌 == false ,而认为!更易读。但其他人可能不这样认为。)


1
我认为这甚至超出了可读性的论点。惊叹号操作符是为此目的而创建的。你应该使用它,因为它可以帮助你用简洁的方式编写这些语句。你可以使用更有限的运算符范围编写代码,但是从可读性的角度来看,你的代码会很糟糕,并且不会遵循每个人都使用的惯例。 - user2481095

8

主要是可读性问题。在阅读其他人的代码时,更加直观易懂的写法是 NOT CONTAINS KEY !values.containsKey(NoteColumns.CREATED_DATE),而不是 CONTAINS KEY IS FALSE (values.containsKey(NoteColumns.CREATED_DATE) == false)


1
这是100%的个人喜好。 - McHat

6

这是一种样式选择。它不会影响代码的性能,只是使读者更容易理解。


5

- 这里更多地关乎于 编码风格 而非 功能实现 ...

- 第一种选项非常明确,但第二种则相当优美... 没有冒犯之意,这只是我的看法。


4
不,我没有看到任何优势。第二个更加直接明了。 顺便说一下,第二种风格在JDK源代码的各个角落都可以找到。

3
注意:使用ConcurrentMap可以更有效地使用。
values.putIfAbsent(NoteColumns.CREATED_DATE, now);

我更喜欢简洁的解决方案,避免使用IsTrue或IsFalse等方法。


太好了,我喜欢这个。由于ConcurrentMap没有从ContentValues派生出来,并且两者之间没有直接的连接,您有任何建议将传递的ContentValues参数转换为ConcurrentMap吗?哦等等,ConcurrentMap是一个接口!让我检查一下,我以前从未遇到过ConcurrentMap - ateiob
有趣的是,它甚至没有扩展 Map,我不确定它是否线程安全。你可以编写一个 putIfAbsent(ContentValues, NoteColumns.CREATED_DATE, now) 方法。;) - Peter Lawrey

1

第一种形式用于返回Boolean的API,并与Boolean.FALSE进行比较时,永远不会抛出NullPointerException

第二种形式用于java.util.Map接口时,也永远不会抛出NullPointerException,因为它返回的是boolean而不是Boolean

如果您不关心一致的编码习惯,那么可以选择您喜欢的一种,在这种具体情况下,确实没有关系。如果您关心一致的编码,请考虑在检查可能为NULLBoolean时要做什么。


1
如果我理解你在哪里看到了一个“Boolean”,那么这可能是一个真正启发性的答案。但我只看到了一个boolean。请解释一下。 - ateiob
在这个具体的情况下,这并不重要。正如你所指出的那样,上面没有显示布尔值。我的担忧是未来的代码可能会返回一个布尔类型并且可能为空。如果你认为这永远不会发生,那么这个答案就没有什么用处了。 - Sam

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