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

时间:2015-05-06 15:43:32

标签: java equals equality

我知道最好使用equals方法调用==方法(参见this question)。我希望两个字符串比较相等,如果它们都是null或者它们代表相同的字符串。不幸的是,如果字符串为equalsNPE方法将抛出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);
}

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

3 个答案:

答案 0 :(得分:79)

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

  

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

这就是你想要的。

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

return s1 == null ? s2 == null : s1.equals(s2);

这是有效的,因为.equals()合同保证对于任何对象oo.equals(null)始终为假。

答案 1 :(得分:44)

来自Objects.equals()

return (a == b) || (a != null && a.equals(b));

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

答案 2 :(得分:4)

如果您不能使用Java 7+解决方案,但在类路径中有Guava或Commons Lang,那么您可以使用以下内容:

<强>番石榴

import com.google.common.base.Objects;

Objects.equal(s1, s2);

Commons Lang

import org.apache.commons.lang3.builder.EqualsBuilder;

new EqualsBuilder().append(s1, s2).isEquals();

import org.apache.commons.lang3.StringUtils;

StringUtils.equals(s1, s2);