Answers:
这是Java内部代码(在其他compare
方法上)使用的:
public static boolean compare(String str1, String str2) {
return (str1 == null ? str2 == null : str1.equals(str2));
}
<0
,==0
或>0
指示哪一个是低/研磨器比其他
Objects.equals(Object, Object)
Mark Rotteveel在他的回答中指出的(请赞成)
从Java 7开始,您可以使用static方法java.util.Objects.equals(Object, Object)
对两个对象执行相等检查,而不必关心它们是否存在null
。
如果两个对象都null
将会返回true
,如果一个是null
,另一个不是,它将返回false
。否则,它将返回调用equals
第二个对象作为参数的第一个对象的结果。
Object.equals(Object)
,没有编译时类型检查。其Objects.equals(Object, Object)
工作原理与normal非常相似equals
,并且由IDE进行Objects.equals(Object, Object)
引用/检查,这些规则也是受启发式支持的(例如IntelliJ IDEA 2016.2具有相同的检查均等和来自对象的检查)。
对于这些情况,最好使用Apache Commons StringUtils#equals,它已经可以处理空字符串。代码示例:
public boolean compare(String s1, String s2) {
return StringUtils.equals(s1, s2);
}
如果您不想添加该库,只需复制该方法的源代码StringUtils#equals
并在需要时应用它。
对于那些无法使用API 19的Objects.equals(str1,str2)的android系统来说,它是这样的:
android.text.TextUtils.equals(str1, str2);
这是无效的。它很少需要使用更昂贵的string.equals()方法,因为由于Android的String Pooling,Android上相同的字符串几乎总是与“ ==”操作数进行比较,而长度检查是一种过滤掉大多数不匹配项的快速方法。
源代码:
/**
* 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)
这些提供了空安全字符串比较。
使用Java 8:
private static Comparator<String> nullSafeStringComparator = Comparator
.nullsFirst(String::compareToIgnoreCase);
private static Comparator<Metadata> metadataComparator = Comparator
.comparing(Metadata::getName, nullSafeStringComparator)
.thenComparing(Metadata::getValue, nullSafeStringComparator);
public int compareTo(Metadata that) {
return metadataComparator.compare(this, that);
}
使用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
您可以java.util.Objects
按以下方式使用 。
public static boolean compare(String str1, String str2) {
return Objects.equals(str1, 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);
}
这是您想要的吗?
false
如果两个String都不相同null
,则返回这种情况。
好,那么“最佳解决方案”是什么意思?
如果您的意思是最易读,那么对于经验丰富的Java程序员,所有可能的解决方案都差不多。但是IMO最易读的是
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
换句话说,将实现隐藏在(可以理想情况下)可以内联的简单方法中。
(如果您已经在代码库中使用它,您也可以“外包”到第三方工具库中。)
如果您是表现最佳的人,则:
null
参数,