我想在Java中比较两个字符串的相等性,当其中一个或两者都是null
时,我不能简单地调用.equals()
。什么是最好的方式?
boolean compare(String str1, String str2) {
...
}
编辑:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
答案 0 :(得分:214)
从Java 7开始,您可以使用静态方法Objects.equals(Object, Object)
对两个对象执行equals检查,而不必关注它们null
。
如果两个对象都是null
,则会返回true
,如果一个是null
而另一个不是,则会返回false
。否则,它将返回第一个对象上调用equals
的结果,第二个作为参数。
答案 1 :(得分:152)
这是Java内部代码使用的(在其他compare
方法上):
public static boolean compare(String str1, String str2) {
return (str1 == null ? str2 == null : str1.equals(str2));
}
答案 2 :(得分:38)
对于这些情况,最好使用Apache Commons StringUtils#equals,它已经处理了空字符串。代码示例:
public boolean compare(String s1, String s2) {
return StringUtils.equals(s1, s2);
}
如果您不想添加库,只需复制StringUtils#equals
方法的source code并在需要时应用它。
答案 3 :(得分:25)
对于那些不能使用API 19的Objects.equals(str1,str2)的android,有这样的:
android.text.TextUtils.equals(str1, str2);
它是安全的。它很少使用更昂贵的string.equals()方法,因为android上的相同字符串几乎总是与“==”操作数比较,感谢Android's 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;
}
答案 4 :(得分:7)
从版本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)
这些提供了空安全字符串比较。
答案 5 :(得分:3)
使用Apache Commons StringUtils类的equals( - , - )和equalsIgnoreCase( - , - )方法比较两个字符串。
StringUtils.equals( - , - ):
StringUtils.equals(null, null) = true
StringUtils.equals(null, "abc") = false
StringUtils.equals("abc", null) = false
StringUtils.equals("abc", "abc") = true
StringUtils.equals("abc", "ABC") = false
StringUtils.equalsIgnoreCase( - , - ):
StringUtils.equalsIgnoreCase(null, null) = true
StringUtils.equalsIgnoreCase(null, "abc") = false
StringUtils.equalsIgnoreCase("xyz", null) = false
StringUtils.equalsIgnoreCase("xyz", "xyz") = true
StringUtils.equalsIgnoreCase("xyz", "XYZ") = true
答案 6 :(得分:2)
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);
}
这是你想要的吗?
答案 7 :(得分:2)
使用 Java 8:
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIKpAuZ/Wwp7FTSCNJ56fFM4Y/rf8ltXp3xnrooPxNc1UoAoGCCqGSM49
AwEHoUQDQgAEqiRaEw3ItPsRAqdDjJCyqxhfm8y3tVrxLBAGhPM0pVhHuqmPoQFA
zR5FA3IJZaWcopieEX5uZ4KMtDhLFu/FHw==
-----END EC PRIVATE KEY-----
答案 8 :(得分:1)
boolean compare(String str1, String str2) {
if (str1 == null || str2 == null)
return str1 == str2;
return str1.equals(str2);
}
答案 9 :(得分:1)
boolean compare(String str1, String str2) {
return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}
答案 10 :(得分:1)
您可以使用以下java.util.Objects
。
public static boolean compare(String str1, String str2) {
return Objects.equals(str1, str2);
}
答案 11 :(得分:0)
好的,那么&#34;最好的解决方案&#34;意思?
如果您的意思是最具可读性,那么对于经验丰富的Java程序员来说,所有可能的解决方案都非常相同。但IMO最具可读性的是
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
换句话说,将实现隐藏在一个简单的方法中(理想情况下)可以内联。
(您也可以&#34; out-source&#34;到第三方实用程序库......如果您已在代码库中使用它。)
如果你的意思是性能最好,那么:
null
参数的相对(动态)发生频率,