当两者都可以为空时如何比较两个字符串?

Ben*_*ler 45 java equality equals

我知道最好equals使用==运算符调用该方法(请参阅此问题).我希望两个字符串比较相等,如果它们都是null或者它们代表相同的字符串.不幸的是,如果字符串是equals,NPE则该方法将抛出null.我的代码目前是:

boolean equals(String s1, String s2) {
  if (s1 == null && s2 == null) {
    return true;
  }
  if (s1 == null || s2 == null) {
    return false;
  }
  return s1.equals(s2);
}
Run Code Online (Sandbox Code Playgroud)

这是不优雅的.执行此测试的正确方法是什么?

fge*_*fge 80

如果是Java 7+,请使用Objects.equals(); 其文档明确指定:

[...]如果两个参数都为null,则返回true,如果只有一个参数为null,则返回false.否则,通过使用第一个参数的equals方法确定相等性.

这就是你想要的.

如果不这样做,您的方法可以重写为:

return s1 == null ? s2 == null : s1.equals(s2);
Run Code Online (Sandbox Code Playgroud)

这工作,因为该.equals()合同保证任何对象o,o.equals(null)永远是假的.

  • `Objects.equals()`中的代码是`return(a == b)|| (a!= null && a.equals(b));`.我想在Java 7之前这是一个更好的方法,因为它直接来自马口. (3认同)
  • @SashaSalauyou我看到了.具有讽刺意味的是,当你的答案是最优雅的时候,你的答案有3个.不幸的是,这些事情发生了,我们不得不继续前进:)如果它未删除我的+1 (2认同)

Ale*_*you 44

来自Objects.equals():

return (a == b) || (a != null && a.equals(b));
Run Code Online (Sandbox Code Playgroud)

非常简单,自我解释和优雅.

  • 我喜欢这个.如果`a`和`b`是相同的引用,它立即返回true. (3认同)