簡體   English   中英

Java中可能為null值的CharSequence和String對象之間的相等性檢查

[英]equality check between CharSequence and String objects with possible null values in java

我有一個CharSequence對象和一個String對象。 我想將相等性檢查(不區分大小寫)與可能的null值進行比較。 我使用嵌套的if語句,它不是那么干凈和優化的。 問題是我無法在null CharSequence對象上調用toString() 如何實現平等檢查?

不會有太多復雜的代碼,也不會嵌套if 下面應該做的。

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

據我了解您的問題,是這樣的:您有兩個對象,並且想查看它們是否相等。

我們想要做的是使用String.equalsIgnoreCase() 這正是您想要的。 如果CharSequence對象不為null,則非常簡單,因為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)

直接使用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));
}
if (charSeq == str ||  (charSeq != null && str != null && charSeq.toString().equalsIgnoreCase(str))) {
   // todo
}

charSeq == str處理兩個均為null的情況(只有這種情況,因為它們屬於不同的類,因此無法標識相同的對象引用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM