将Java中的两个string与可能的空值进行比较

我想比较两个string在Java中的相等性,当其中一个或两个都可以为null ,所以我不能简单地调用.equals() 。 什么是最好的方法?

 boolean compare(String str1, String str2) { ... } 

编辑:

 return ((str1 == str2) || (str1 != null && str1.equals(str2))); 

这是Java内部代码使用(在其他compare方法上):

 public static boolean compare(String str1, String str2) { return (str1 == null ? str2 == null : str1.equals(str2)); } 

从Java 7开始,您可以使用静态方法Objects.equals(Object, Object)对两个对象执行equals检查,而不必关心它们为null

如果两个对象都为null ,它将返回true ,如果一个是null ,另一个不是,则返回false 。 否则,它将返回第一个对象的equals第二个参数的结果。

对于这些情况,最好使用Apache Commons的 StringUtils#equals ,它已经处理了空string。 代码示例:

 public boolean compare(String s1, String s2) { return StringUtils.equals(s1,s2); } 

如果您不想添加库,只需复制StringUtils#equals方法的源代码 ,并在需要时应用它。

对于那些不能使用API​​ 19的Objects.equals(str1,str2)的人,有这样的:

 android.text.TextUtils.equals(str1, str2); 

它是无效的。 很less有必要使用更昂贵的string.equals()方法,因为Android上的相同string几乎总是与Android的string池(String Pooling)比较真正的“==”操作数,并且长度检查是过滤大多数不匹配的快速方法。

源代码:

 /** * Returns true if a and b are equal, including if they are both null. * <p><i>Note: In platform versions 1.1 and earlier, this method only worked well if * both the arguments were instances of String.</i></p> * @param a first CharSequence to check * @param b second CharSequence to check * @return true if a and b are equal */ public static boolean equals(CharSequence a, CharSequence b) { if (a == b) return true; int length; if (a != null && b != null && (length = a.length()) == b.length()) { if (a instanceof String && b instanceof String) { return a.equals(b); } else { for (int i = 0; i < length; i++) { if (a.charAt(i) != b.charAt(i)) return false; } return true; } } return false; } 

从版本3.5 Apache Commons的StringUtils有以下方法:

 static int compare(String str1, String str2) static int compare(String str1, String str2, boolean nullIsLess) static int compareIgnoreCase(String str1, String str2) static int compareIgnoreCase(String str1, String str2, boolean nullIsLess) 

这些提供了null安全string比较。

 boolean compare(String str1, String str2) { return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2); } 
 boolean compare(String str1, String str2) { if(str1==null || str2==null) { //return false; if you assume null not equal to null return str1==str2; } return str1.equals(str2); } 

这是你想要的吗?

 boolean compare(String str1, String str2) { if (str1 == null || str2 == null) return str1 == str2; return str1.equals(str2); } 

好的,那么“最佳解决scheme”是什么意思?

如果你的意思是最可读的,那么对于一个有经验的Java程序员来说,所有可能的解决scheme都是相当的。 但IMO最可读的是这个

  public boolean compareStringsOrNulls(String str1, String str2) { // Implement it how you like } 

换句话说,隐藏实现在一个简单的方法(理想情况下)可以内联。

(如果你已经在你的代码库中使用它,你也可以“外部”到第三方实用程序库。)


如果你的意思是最高性能的,那么:

  1. 最高性能的解决scheme取决于平台和上下文,
  2. “上下文”问题之一是null参数出现的相对(dynamic)频率,
  3. 可能没有关系哪个版本更快…因为差别可能太小,不能影响整体应用程序的性能
  4. 如果它确实重要,唯一的方法是找出在你的平台上最快的是尝试两个版本,并衡量差异。

您可以使用java.util.Objects ,如下所示。

 public static boolean compare(String str1, String str2) { return Objects.equals(str1, str2); }