3

可能重复:
比较可能为空的字符串的更好方法

我有一个看起来像这样的 if 条件:

if( !str1.equals(str2) )
{
    ---
    ---
    ---
}

其中 str1 和 str2 是两个字符串对象。

str1 有可能是 null ,那么下面的代码是否与上面的代码等价,以及处理 null 检查?

if( !(str1==null ? str2==null : str1.equals(str2)) )
{
    ---
    ---
    ---
}

谢谢!

4

6 回答 6

5

假设您希望两个空值相等,当然。根据您的方法,NullPointerException 可能是正确的响应。通过了解,您可以节省大量打字时间

org.apache.commons.lang.StringUtils

!StringUtils.equals(str1, str2);以相同的方式为您处理空值。

于 2012-04-04T17:17:00.173 回答
5

如果您使用的是 Java 7:

java.util.Objects.equals(str1, str2);
于 2012-04-04T17:18:22.840 回答
4

是的,这将导致相同的结果。

更具体一点:

  1. 如果str1 不为空,则完全相同,因为它只是通过三元检查得到与之前相同的表达式
  2. 如果str1 空,则检查是否str2也为

而且由于您将整个三元表达式都包裹在!前面,因此其行为与以前相同。

如果您想更清楚一点,可以在and :str2==null之间进行实际比较。由于其中一个值已经是,因此它是参考检查而不是正确的字符串相等检查并不重要,并且最终在代码中更加清晰(对我来说,无论如何)str1str2str1==str2null

然而,正如其他人所提到的,Apache Commons 库已经包含了这种空安全相等功能,但它确实需要包含相当大量的库。另一方面,许多人认为 Apache Commons 功能应该被视为 Java 本身的一部分,因此您可以自己决定是否需要额外的依赖项。

最后,该功能在技术上并不等效,因为默认.equals()方法会抛出 a NullPointerException,而您的相等检查代码不会。如果这是您正在寻找的行为(我认为是),那么您很好,但这是需要注意的事情。

于 2012-04-04T17:15:38.667 回答
2

它看起来是正确的,如果你认为nulls 相等,并且允许str2null。但是你最好不要相信任何人,而是为所有可能的情况编写一个测试。

于 2012-04-04T17:18:17.640 回答
1

使用三元运算符是一种非常愚蠢的检查方式,它会让你阅读起来感到沮丧。只需使用 AND。

if(str1 != null && !str1.equals(str2))
{
    ---
    ---
    ---
}

您不需要导入一个全新的库来进行空检查。

于 2012-04-04T17:18:07.600 回答
0

是的,只有当字符串不相等时,您的代码才会进入该if块(其中只有一个为空或两者都不为空且不同)。

另一种方法是

if( (str1 == null && str2 != null) || !str1.equals(str2) ){
    // Only executes when strings are unequal
}

这是口味问题,有些人对三元运算符过敏。(我喜欢他们)。

于 2012-04-04T17:39:46.313 回答