【问题标题】:How to compare two Strings when both can be null? [duplicate]当两个字符串都可以为空时如何比较两个字符串? [复制]
【发布时间】:2015-07-16 20:56:00
【问题描述】:

我知道调用equals 方法优于使用== 运算符(请参阅this question)。如果两个字符串都为空或表示相同的字符串,我希望两个字符串比较相等。不幸的是,如果字符串为null,equals 方法将抛出NPE。我的代码目前是:

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

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

【问题讨论】:

  • 怎么不优雅?还有什么方法可以确定?
  • 在 commons.lang 中使用 StringUtils.equals(s1, s2)
  • @fge 我一直不明白为什么人们将答案发布为 cmets。不过我想知道,愿意分享你的推理吗?
  • @Pureferret 没有特别的原因,真的......当答案真的只是对现有方法的引用时出于习惯:p
  • @fge 在我看来,它要么最终成为 a) 和答案,要么 b) 作为评论丢失,没有进一步(有用的)解释。

标签: java equals equality


【解决方案1】:

如果Java 7+,使用Objects.equals();它的文档明确指出:

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

这就是你想要的。

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

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

这是可行的,因为.equals() 合约保证对于任何对象o,o.equals(null) 始终为假。

【讨论】:

  • Objects.equals() 中的代码是return (a == b) || (a != null && a.equals(b));。我想这将是在 Java 7 之前更好的方法,因为它直接来自马口。
  • @SashaSalauyou 我看到了。具有讽刺意味的是,当它是最优雅的答案时,您的答案却得到了 3 票反对。不幸的是,这些事情发生了,我们必须继续前进 :) 如果未删除,请向我 +1
  • @ChetanKinger Objects.equals()的代码此时确实是一个微优化;它基本上首先检查引用相等性,这恰好适用于null(因为null == null 为真)然后检查a 不为空,在这种情况下它调用.equals();我的代码真的没有太大区别,真的。而且我根本不理解反对票。
  • @fge 我没有对你投反对票。没有必要对这个答案投反对票。当我对答案投反对票时,我总是发表评论。否决投票者可以发表评论,以便 OP 知道答案有什么问题吗?
  • @ChetanKinger 不知道.equals是怎么实现的。但是,链接的文档说明了它将做什么。此答案中建议的代码比您的代码更接近该文档所说的内容。然而,它只会对 a.equals(a) 可能返回 false 的类产生影响,这看起来很愚蠢。
【解决方案2】:

来自Objects.equals():

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

非常简单,不言自明,优雅。

【讨论】:

  • 我喜欢这个。如果a 和b 是同一个引用,则立即返回true。
【解决方案3】:

如果您不能使用 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);

【讨论】:

  • 如果您使用 Commons Lang,StringUtils.equals 不是更有意义吗?
  • @BrendanLong - 感谢您的提示
猜你喜欢
  • 2017-11-19
  • 2019-09-08
  • 1970-01-01
  • 2019-05-19
  • 2014-02-21
  • 2022-06-29
  • 2019-10-05
  • 2019-01-14
相关资源
最近更新 更多