回答:
これは、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以降では、静的メソッドjava.util.Objects.equals(Object, Object)
を使用して、2つのオブジェクトが等しいかどうかを気にすることなく、それらのオブジェクトに対して等価チェックを実行できますnull
。
両方のオブジェクトがnull
存在する場合はそれが返されtrue
、一方がそうnull
でもう一方がそうでない場合はそれが返されfalse
ます。それ以外の場合equals
は、2番目を引数として最初のオブジェクトを呼び出した結果を返します。
Object.equals(Object)
場合、コンパイル時の型チェックはありません。Objects.equals(Object, Object)
非常に多く、通常と同じように機能しequals
、そして再推論/ IDEによってチェックは、これらのルールはまたのためにサポートされている経験則ですObjects.equals(Object, Object)
(例えばのIntelliJ IDEA 2016.2通常の等号とオブジェクトから1の両方に同じチェックを持っています)。
これらの場合は、Apache Commons StringUtils#equalsを使用する方がよいでしょう。すでにnull文字列を処理しています。コードサンプル:
public boolean compare(String s1, String s2) {
return StringUtils.equals(s1, s2);
}
ライブラリを追加したくない場合は、メソッドのソースコードをコピーして、StringUtils#equals
必要なときに適用します。
Android 19でAPI 19のObjects.equals(str1、str2)を使用できない人のために、これがあります:
android.text.TextUtils.equals(str1, str2);
ヌルセーフです。Androidの同一の文字列は、Androidの文字列プーリングのおかげでほとんど常に「==」オペランドとtrueと比較されるため、より高価なstring.equals()メソッドを使用する必要はほとんどなく、長さチェックはほとんどの不一致をすばやく除外する方法です。
ソースコード:
/**
* 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)
これらはnullセーフな文字列比較を提供します。
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(-、-)メソッドを使用して2つの文字列を比較します。
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
、両方のストリングがnull
望ましい結果ではない可能性がある場合に返されます。
では、「最善の解決策」とはどういう意味ですか?
最も読みやすいということであれば、すべての可能な解決策は、経験豊富なJavaプログラマーにとってほぼ同等です。しかし、IMOで最も読みやすいのはこれです。
public boolean compareStringsOrNulls(String str1, String str2) {
// Implement it how you like
}
つまり、インライン化できる(理想的には)単純なメソッド内に実装を隠します。
(コードベースですでに使用している場合は、サードパーティのユーティリティライブラリに「アウトソース」することもできます。)
最もパフォーマンスが高い場合は、次のようにします。
null
引数。