253

どちらかまたは両方がnull.

.equals()したがって、値を含めることができるため、単純に呼び出すことはできませんnull

私がこれまでに試したコード:

boolean compare(String str1, String str2) {
  return ((str1 == str2) || (str1 != null && str1.equals(str2)));
}

を含むすべての可能な値をチェックする最良の方法は何nullですか?

4

12 に答える 12

431

Java 7 以降では、 static メソッドを使用してjava.util.Objects.equals(Object, Object)、2 つのオブジェクトが .xml であることを気にせずに等しいチェックを実行できますnull

両方のオブジェクトが存在する場合nullは を返しtrue、一方が存在nullし、もう一方が存在しない場合は を返しfalseます。equalsそれ以外の場合は、2 番目のオブジェクトを引数として最初のオブジェクトを呼び出した結果が返されます。

于 2012-06-30T07:40:28.817 に答える
211

これは、Java 内部コードが (他のcompareメソッドで)使用するものです。

public static boolean compare(String str1, String str2) {
    return (str1 == null ? str2 == null : str1.equals(str2));
}
于 2012-06-30T05:11:22.397 に答える
50

これらのケースでは、Apache Commons StringUtils#equalsを使用する方がよいでしょう。これはすでに null 文字列を処理しています。コードサンプル:

public boolean compare(String s1, String s2) {
    return StringUtils.equals(s1, s2);
}

ライブラリを追加したくない場合は、メソッドのソース コードStringUtils#equalsをコピーして、必要なときに適用してください。

于 2012-06-30T05:24:00.057 に答える
7

バージョン 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 安全な文字列比較を提供します。

于 2016-11-22T15:15:03.157 に答える
5

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
于 2018-06-10T11:34:27.283 に答える
4

以下のように使え java.util.Objectsます。

public static boolean compare(String str1, String str2) {
    return Objects.equals(str1, str2);
}
于 2016-02-08T08:10:07.023 に答える
1
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);
}

これはあなたが望んだものですか?

于 2012-06-30T05:02:51.307 に答える
0

では、「可能な限り最善の解決策」とはどういう意味ですか?

最も読みやすいという意味であれば、考えられるすべての解決策は、経験豊富な Java プログラマーにとってほぼ同等です。しかし、IMOで最も読みやすいのはこれです

 public boolean compareStringsOrNulls(String str1, String str2) {
     // Implement it how you like
 }

つまり、(理想的には) インライン化できる単純なメソッド内に実装を隠します。

(サードパーティのユーティリティ ライブラリに「アウトソース」することもできます...コードベースで既に使用している場合。)


最もパフォーマンスが高いという意味であれば、次のようになります。

  1. 最もパフォーマンスの高いソリューションは、プラットフォームとコンテキストによって異なります。
  2. null「コンテキスト」の問題の 1 つは、引数の相対的な (動的な) 発生頻度です。
  3. おそらくどちらのバージョンが速いかは問題ではありません...おそらく違いが小さすぎて、アプリケーション全体のパフォーマンスに違いが生じないためです。
  4. 問題がある場合、プラットフォームでどちらが最速かを判断する唯一の方法は、両方のバージョンを試して違いを測定することです。
于 2012-06-30T05:25:54.333 に答える
0
boolean compare(String str1, String str2) {
    if (str1 == null || str2 == null)
        return str1 == str2;

    return str1.equals(str2);
}
于 2012-06-30T05:06:01.967 に答える
0
boolean compare(String str1, String str2) {
  return (str1==null || str2==null) ? str1 == str2 : str1.equals(str2);
}
于 2012-06-30T05:10:29.730 に答える