web-dev-qa-db-ja.com

両方がヌルになる可能性があるときに2つの文字列を比較する方法は?

==演算子を使用するよりもequalsメソッドを呼び出す方がよいことを認識しています( この質問 を参照)。 2つの文字列が両方ともnullである場合、または同じ文字列を表す場合、2つの文字列を等しいものとして比較する必要があります。残念ながら、文字列がequalsの場合、NPEメソッドはnullをスローします。私のコードは現在:

boolean equals(String s1, String s2) {
  if (s1 == null && s2 == null) {
    return true;
  }
  if (s1 == null || s2 == null) {
    return false;
  }
  return s1.equals(s2);
}

これは洗練されていません。このテストを実行する正しい方法は何ですか?

45
Benjy Kessler

Java 7+の場合、 Objects.equals() を使用します。そのドキュメントでは、次のことが明示的に指定されています。

[...]両方の引数がnullの場合、trueが返され、正確に一方の引数がnullの場合、falseが返されます。それ以外の場合、等しいかどうかは、最初の引数のequalsメソッドを使用して決定されます。

あなたが望むものです。

そうしない場合、メソッドを次のように書き換えることができます。

_return s1 == null ? s2 == null : s1.equals(s2);
_

これは、.equals()コントラクトがすべてのオブジェクトoo.equals(null)が常にfalseであることを保証するために機能します。

80
fge

Objects.equals() から:

return (a == b) || (a != null && a.equals(b));

非常にシンプルで、わかりやすく、エレガントです。

44
Alex Salauyou

Java 7+ソリューションを使用できないが、クラスパスにGuavaまたはCommons Langがある場合、次を使用できます。

グアバ

import com.google.common.base.Objects;

Objects.equal(s1, s2);

コモンズラング

import org.Apache.commons.lang3.builder.EqualsBuilder;

new EqualsBuilder().append(s1, s2).isEquals();

または

import org.Apache.commons.lang3.StringUtils;

StringUtils.equals(s1, s2);
4
Michal Kordas