How to compare two Strings when both can be null? [duplicate]
I am aware that it is better to call the equals
method over using the ==
operator (see this question). I want two strings to compare as equal if they are both null or if they represent the same string. Unfortunately the equals
method will throw an NPE
if the strings are null
. My code is currently:
boolean equals(String s1, String s2) {
if (s1 == null && s2 == null) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
return s1.equals(s2);
}
This is inelegant. What is the correct way to perform this test?
Solution 1:
If Java 7+, use Objects.equals()
; its documentation explicitly specifies that:
[...] if both arguments are null, true is returned and if exactly one argument is null, false is returned. Otherwise, equality is determined by using the equals method of the first argument.
which is what you want.
If you don't, your method can be rewritten to:
return s1 == null ? s2 == null : s1.equals(s2);
This works because the .equals()
contract guarantees that for any object o
, o.equals(null)
is always false.
Solution 2:
From Objects.equals()
:
return (a == b) || (a != null && a.equals(b));
Very simple, self-explaining and elegant.
Solution 3:
If you can't use Java 7+ solution, but you have Guava or Commons Lang in classpath, then you can use the following:
Guava:
import com.google.common.base.Objects;
Objects.equal(s1, s2);
Commons Lang:
import org.apache.commons.lang3.builder.EqualsBuilder;
new EqualsBuilder().append(s1, s2).isEquals();
or
import org.apache.commons.lang3.StringUtils;
StringUtils.equals(s1, s2);