我想比较两个字符串是否相等,当其中一个或两个都可以为空时。

因此,我不能简单地调用.equals(),因为它可以包含空值。

到目前为止,我尝试过的代码:

boolean compare(String str1, String str2) {
  return ((str1 == str2) || (str1 != null && str1.equals(str2)));
}

检查包括空值在内的所有可能值的最佳方法是什么?


当前回答

boolean compare(String str1, String str2) {
    if(str1==null || str2==null) {
        //return false; if you assume null not equal to null
        return str1==str2;
    }
    return str1.equals(str2);
}

这是你想要的吗?

其他回答

好的,那么best possible solution是什么意思呢?

如果您指的是最可读的,那么对于有经验的Java程序员来说,所有可能的解决方案都差不多。但在我看来,最有可读性的是这个

 public boolean compareStringsOrNulls(String str1, String str2) {
     // Implement it how you like
 }

换句话说,将实现隐藏在可以内联的简单方法中(理想情况下)。

(你也可以“外包”给第三方工具库……如果你已经在你的代码库中使用了它。)


如果你指的是最具性能,那么:

最高效的解决方案取决于平台和环境, “上下文”问题之一是空参数出现的相对(动态)频率, 哪个版本更快可能并不重要……因为这种差异可能太小,不会对整体应用程序性能产生影响 如果这真的很重要,那么找出在你的平台上哪个版本最快的唯一方法就是尝试两个版本并衡量差异。

对于这些情况,最好使用Apache Commons StringUtils#equals,它已经处理空字符串了。代码示例:

public boolean compare(String s1, String s2) {
    return StringUtils.equals(s1, s2);
}

如果你不想添加库,只需复制StringUtils#equals方法的源代码,并在需要时应用它。

这是Java内部代码使用的(在其他比较方法上):

public static boolean compare(String str1, String str2) {
    return (str1 == null ? str2 == null : str1.equals(str2));
}
boolean compare(String str1, String str2) {
  return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}

您可以像下面那样使用java.util.Objects。

public static boolean compare(String str1, String str2) {
    return Objects.equals(str1, str2);
}