Java中的字符串比较

3
可能重复:

更好的比较可能为空的字符串的方法
链接

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

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

“str1和str2是两个字符串对象。”
“有可能str1为空,所以下面的代码是否等同于上述代码,并处理了空值检查?”
if( !(str1==null ? str2==null : str1.equals(str2)) )
{
    ---
    ---
    ---
}

谢谢!


取决于您在脑海中想象的代码片段中如何处理空值检查。 - David Heffernan
如果 str1null,那么如果你执行 str1.equals();,你将会得到 NullPointerException。更多细节请查看此链接:https://dev59.com/WXE85IYBdhLWcg3wzm5p - Vyoma
你的条件看起来很好。你可以将它重写为 if( str1==null ? str2!=null : !str1.equals(str2) ),这样可能更容易阅读。 - NullUserException
6个回答

5

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

org.apache.commons.lang.StringUtils

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


Apache字符串工具可以对任何项目提供巨大的帮助,为什么要重复造轮子呢! - Mike McMahon
在我介入之前,+1 建议使用 Apache Commons StringUtils。StringUtils 对于处理空值的比较非常有用。 - Tom Quarendon
1
当只需要很少量的代码时,它也可能引入大量依赖。 - maerics

5

如果您正在使用Java 7:

java.util.Objects.equals(str1, str2);

4

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

更具体地说:

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

由于整个三元表达式都被 ! 包裹,所以其行为与之前相同。

如果您想要更清晰一些,可以将 str2==null 改为实际比较 str1str2str1==str2。由于其中一个值已经是 null,所以它不需要进行引用检查而不是正确的字符串相等性检查,并且在代码中更加清晰(对我来说是这样)

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

最后,这个功能在技术上并不等同,因为默认的 .equals() 方法会抛出一个 NullPointerException,而您的相等性检查代码则不会。如果这是您要寻找的行为(我想是的),那么您就没问题了,但需要注意这一点。


2

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


1

使用三元运算符来进行那个检查是一种非常愚蠢的方式,它会让你的代码难以阅读。只需使用“与”操作符即可。

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

你不需要导入整个新库来进行空值检查。


+1 赞同使用简单解决方案而不是使用库来保持清醒。 - maerics
2
这段代码没有检查str2是否等于(即null == null)str1。相反,这段代码表示如果str1 == null,那么它就不可能等于str2。此答案还未回答这两个选项是否相等的问题。 - cdeszaq
@cdeszaq OP希望在str1和str2不相等的情况下进入if语句。这就是他的第一个if语句所做的。所有这段代码所做的就是确保str1也不为null。如果你重新阅读帖子,你会注意到OP并不关心str2是否为null。 - Hunter McMillen
根据您提供的代码,如果str2 == nullstr1 == null,即使str2 == str1,您也不会进入该代码块。因此,您的代码未能通过两个输入都为null的测试,因为您的代码没有将它们视为相等,尽管它们实际上是相等的。 - cdeszaq
@HunterMcMillen OP想要检查str1str2是否不相等。他们只提到了str1,因为如果str1nullstr1.equals(str2)会导致NPE。正如在问题的第二段代码中所看到的那样,他们显然关心str2。当两者都为null时,您的答案会失败。 - NullUserException

0

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

另一种方法是

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

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


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