可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to compare two strings for equality in Java, when either or both could be null
, so I cannot simply call .equals()
. What is the best way?
boolean compare(String str1, String str2) { ... }
Edit:
return ((str1 == str2) || (str1 != null && str1.equals(str2)));
回答1:
This is what Java internal code uses (on other compare
methods):
public static boolean compare(String str1, String str2) { return (str1 == null ? str2 == null : str1.equals(str2)); }
回答2:
Since Java 7 you can use the static method Objects.equals(Object, Object)
to perform equals checks on two objects without caring about them being null
.
If both objects are null
it will return true
, if one is null
and another isn't it will return false
. Otherwise it will return the result of calling equals
on the first object with the second as argument.
回答3:
For these cases it would be better to use Apache Commons StringUtils#equals, it already handles null strings. Code sample:
public boolean compare(String s1, String s2) { return StringUtils.equals(s1, s2); }
If you dont want to add the library, just copy the source code of the StringUtils#equals
method and apply it when you need it.
回答4:
For those on android, who can't use API 19's Objects.equals(str1, str2), there is this:
android.text.TextUtils.equals(str1, str2);
It is null safe. It rarely has to use the more expensive string.equals() method because identical strings on android almost always compare true with the "==" operand thanks to Android's String Pooling, and length checks are a fast way to filter out most mismatches.
Source Code:
/** * Returns true if a and b are equal, including if they are both null. * Note: In platform versions 1.1 and earlier, this method only worked well if * both the arguments were instances of String.
* @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
回答5:
Since version 3.5 Apache Commons StringUtils has the following methods:
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)
These provide null safe String comparison.
回答6:
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); }
is this what you desired?
回答7:
boolean compare(String str1, String str2) { if (str1 == null || str2 == null) return str1 == str2; return str1.equals(str2); }
回答8:
boolean compare(String str1, String str2) { return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2); }
回答9:
OK, so what does "best possible solution" mean?
If you mean most readable, then all the possible solutions are pretty much equivalent for an experienced Java programmer. But IMO the most readable is this
public boolean compareStringsOrNulls(String str1, String str2) { // Implement it how you like }
In other words, hide the implementation inside a simple method that (ideally) can be inlined.
(You could also "out-source" to a 3rd party utility library ... if you already use it in your codebase.)
If you mean most performant, then:
- the most performant solution depends on the platform and the context,
- one of the "context" issues is the relative (dynamic) frequency of occurrence of
null
arguments, - it probably doesn't matter which version is faster ... because the difference is probably too small to make a difference to the overall application performance, and
- if it does matter, the only way to figure out which is fastest ON YOUR PLATFORM is to try both versions and measure the difference.
回答10:
You can use java.util.Objects
as following.
public static boolean compare(String str1, String str2) { return Objects.equals(str1, str2); }