2011-12-01 7 views
13

もっと良い方法があるのか​​どうか疑問に思っていました。私はそれが非効率的かもしれないと感じます。問題はDBの理由のために私は時々nullであるかどうかを比較する必要がある文字列です。nullの可能性がある文字列を比較するより良い方法

public static boolean compareStrings(String str1, String str2){ 

    if(str1 == null && str2 == null) return true; 

    if(str1 != null && str2 != null){ 
     if(str1.equals(str2)) 
      return true; 
    } 

    return false; 
} 
+0

移行を比較する等しいですか? –

+0

ごめんなさいありがとうございます。 – Maurycy

答えて

46

通常のイディオムはこれです:

return (str1 == null ? str2 == null : str1.equals(str2)); 
+19

アンドロイドとTextUtils.equals(a、b)でこれを行っていたことを追加したいと思います。正確にこれを行う – Maurycy

1

それはあなたのプログラムの通常の実行中にボトルネックが発生した場合、このコードは唯一の非効率的だろう。これが当てはまるかどうかを知る唯一の方法は、プロファイラでプログラムを実行することです。あなたがそれを行い、この機能がパフォーマンスの問題を引き起こすという事実を見るまで、私はそれについて心配しません。

+0

これは特にプロファイルなしで心配するのはちょっと気になるかもしれません。メモリリークが発生しない限り、私は通常プロファイラを使用しません。自分自身の静的メソッドを開発するよりも優れた実装があるかどうか、多かれ少なかれ疑問に思っていました。ありがとうございました – Maurycy

29

これらは潜在的にデータベースからのものだと言います。その時点で、いくつかの無効テストに関する非効率性は、正直なところ、データベースクエリのコストに比べて全く重要ではありません。私は読みやすさに焦点を当てます。そのために

、私はGuavaとそのObjectsクラスを使用して起動します:

boolean equal = Objects.equal(a, b); 

私は基本的に、それはTaymonのコードにつきとして実装することが期待される - それはの場所でそれを持ってうれしいです。

編集: Java 7+では、Guavaは必要ありません。 java.util.Objects.equal(a, b)を使用することができます。 //codereview.stackexchange.com/...:

+0

"可読性"という言葉は、実際には私には 'object.ReferenceEquals'を考えさせています。これは良いことではありません:( –

+0

@pst:静的な' object.Equals'メソッド。これはすでに.NETに組み込まれています。 –

+11

これよりも最近になっている人にとっては、Java 7でも同じことがあります:[Objects.equals](http://docs.oracle.com/javase/7 /docs/api/java/util/Objects.html#equals%28java.lang.Object,%20java.lang.Object%29) –

4

あなたは、Apache CommonsののStringUtilsを使用することに開かれている場合、彼らはしているが、HTTPに二つの文字列はnullセーフ

関連する問題