Java中的字符串相等性

4

当检查两个Java String是否相等时,我看到了以下两种写法:

// Method A
String string1;
// ...
if("MyString".equals(string1)) {
    // ...
}

并且

// Method B
String string1;
// ...
if(string1.equals("MyString")) {
    // ...
}

我的问题是:哪个更好,更广泛使用?

谢谢大家的回答。我习惯于像Peter描述的那样做,但现在我意识到如果可能出现null,选项1可能更好。 - AniDev
6个回答

10

如果您确定string1永远不会为null,那么选项2易读且更受欢迎。否则,请选择选项1。选项1的目的是避免潜在的空指针错误。


2
为什么会被踩?事实上,选项2更自然(将变量与文字进行比较,而不是反过来),除非考虑到空值。 - Kirk Woll
不确定是谁给它点了踩,但我可以理解反对你“更喜欢选项2”的说法。根据我的经验,选项1更受欢迎,因为正如你所解释的那样,选项2没有考虑到空值。 - jzd
1
@jzd - 这就是为什么我提到了前置条件“如果您确定string1永远不会为空”。 - Aravind Yarram
@Pangea,是的,你说得对。但我的观点是,在你的问题中,唯一可以拿出一个对象的是选项2更受欢迎。所有的都是正确的。 - jzd
1
我总是选择第一种形式。我不同意第二种形式更易读的说法,因此第一种形式的安全性胜出。尽管您可能相信您永远不会遇到null引用,但您的代码可能会在意想不到的方式中使用,因此最好进行防御性编码。(顺便说一句,如果您想知道,我没有给您投反对票)。 - Neil Bartlett
显示剩余2条评论

3

方法B在string1为空时会抛出NullPointerException,而方法A永远不会抛出此异常。一些权威机构强制要求进行这种“防御性”编程。他们影响了我去做它,尽管这仍然不是自然而然的!

也可以写成:

if (string1 != null && string1.equals("MyString")) ...

尽管诸如FindBugs之类的工具将其标记为可能的错误,假设您已经确保string1已经非空。 (您能依赖于评估的顺序吗?)
因此,有不同的观点。

3

方法A不会抛出空指针异常。这两种方法没有更好的选择。它取决于你是否希望它抛出npe(在整体设计中可能需要)。


1
我不认为我同意你的观点。如果string1可以为空但不应为空,那么你至少应该明确地抛出NPE,或者是IllegalArgumentException或IllegalStateException等异常。我不会主张将隐式NPE作为显式控制流构造设计。 - extraneon

0

方法a不会抛出NullPointerException,因此非常方便。它也被广泛使用。


0

异常处理是用于特殊情况的处理,与检查错误条件并使用常规逻辑处理它们相比,具有更多的开销。如果您已经编程十年,NPE(空指针异常)通常表示代码不够谨慎,这会让人感到不安。通过使用"constant".equals(variable)来避免它们,这样阅读和使用您的代码的人会更加愉快。


-2
第二个更广泛使用。两者都没有更好的。
这与相同的想法一样。
if (1 == x)

但没有具体的原因。 但是出于不同的原因。(正如其他人所指出的那样,空指针)。


1
这是不正确的。如果你不能保证string1不为空,那么你就不应该在该字符串上使用equals方法。因此,最好的做法是使用"某个常量".equals(某个字符串),而不是反过来。 - extraneon
并不一定是“更好的实践”。这取决于使用情况。 - Falmarri

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