【问题标题】:equality check between CharSequence and String objects with possible null values in java在 java 中,CharSequence 和 String 对象之间的相等性检查可能为空值
【发布时间】:2018-07-04 12:30:59
【问题描述】:

我有一个CharSequence 对象和一个String 对象。我想将两者的相等性检查(不区分大小写)与可能的 null 值进行比较。我使用了嵌套的if 语句,它不是那么干净和优化。问题是我不能在 null CharSequence 对象上调用 toString()。如何实现平等检查?

【问题讨论】:

  • 如果两者都为空怎么办?他们应该被视为平等吗?
  • 是的@DanielePantaleone

标签: java


【解决方案1】:

不会有太多复杂的代码,也不会嵌套if。下面应该做。

if(Objects.equals(charSeq,str) || (charSeq !=null && str !=null && charSeq.toString().equalsIgnoreCase(str))) {
   // todo
}

【讨论】:

  • 如果 charSeq 为 null 而 str 不为 null 怎么办?
  • 这不包括 OP 请求:“不区分大小写检查”;)
  • @XoXo 然后它们不相等,您可以控制 else 语句。
  • 很好,但请使用 equalsIgnoreCase 使您的答案更正确。
  • 所以,我做了一个小时的研究,发现equalsIgnoreCase 方法解决了这个问题。 ;)
【解决方案2】:

据我了解您的问题是这样的: 你有两个对象,你想看看它们是否相等。

我们想做的是使用String.equalsIgnoreCase()。这正是你想要的。 如果 CharSequence 对象不为空,这很容易,因为CharSequence.toString() 返回一个字符串,其中包含完全相同的字符以完全相同的顺序。

charSequence.toString().equalsIgnoreCase(otherString);

不幸的是,这不起作用。如果 charsequence 为 null,则抛出 NullPointerException。所以我们需要看看字符序列是否为空,然后从那里开始。

public boolean compareCSAndString(CharSequence cs, String string) {
  if(cs == null) {
    // If both are null, then they're equal
    return string == null; 
  }
  else {
    return cs.toString().equalsIgnoreCase(string);
  }
}

这勾选了所有框:

  • 不区分大小写
  • 它处理空值
  • 简洁易读(没有嵌套的ifs)

【讨论】:

  • 你可以简化为public boolean compareCSAndString(CharSequence cs, String string) { return cs != null ? cs.toString().equalsIgnoreCase(string) : false; }
  • 这样更简单吗?我知道它更短,但更容易阅读对我来说每次都获胜。我想这是风格问题。
【解决方案3】:
if (charSeq == str ||  (charSeq != null && str != null && charSeq.toString().equalsIgnoreCase(str))) {
   // todo
}

charSeq == str处理两者都为null的情况(只有这种情况,因为它们属于不同的类,无法识别相同的对象引用

【讨论】:

    【解决方案4】:

    直接使用equals() 将不起作用,因为CharSequence 的子类之间的equals() 不能互操作。
    您可以使用toString() 方法作为CharSequence 子类之间的桥梁,因为它在某些情况下是可互操作的(例如StringStringBuilder),但并非在所有情况下都是如此。

    例如,在 CharBuffer 对象上调用 toString() 可能会给出特定结果,因为 CharBuffer.toString() 依赖于缓冲区当前位置。

    为了获得一致的结果,我认为您没有其他选择,首先检查传递的对象的类型,然后执行比较:使用toString() 作为StringBuilder/StringBuffer 的桥梁并以不同的方式处理其他类型。

    对于桥接比较,假设您只期望 StringBuilderString 作为子类:

    public boolean compareContent(CharSequence charSequence, String string) {
      if (!(charSequence instanceof StringBuilder || charSequence instanceof String){
          // Exception, logging, more customized comparison or return false
      }
      return charSequence.toString().equalsIgnoreCase(string));
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多