1

これら2つのコードの間にパフォーマンスの違いがあるかどうか知りたいです。

String sample="hello";
    if(sample!=null)
    {
       if(!sample.equals(""))
        {
            // some code in here
         }
    }

また

String sample="hello";
    if(sample!=null && !sample.equals(""))
    {

            // some code in here
    }

私が理解している限り、最初のコードでは、サンプルがnullでない場合、それだけがブロックに入ります。2番目のコードの場合も同じです。私が知りたいのは、パフォーマンスやより良いコーディング標準の違いとその理由です。

4

4 に答える 4

14

パフォーマンスについて質問する場合は、常に測定する必要があります。しかし、いいえ、違いはありません。その上、それがあなたの唯一のパフォーマンス問題のあるコードであるなら、私はあなたを真剣にうらやましく思います。

コーディング標準について。入れ子が少ないほど、ほとんどの場合、読んで従うほうがよいでしょう。ifこれは、特にそれらが関連しているため、両方を1つにまとめることが望ましいことを意味します。パターン

if (check_foo_for_null && compare_foo)

非常に一般的であるため、別のネストされたif

編集:それをバックアップするには:

私には2つの小さな方法があります:

static boolean x(String a) {
    if (a != null && a.equals("Foo"))
        return true;
    else return false;
}

static boolean y(String a) {
    if (a != null) {
        if (a.equals("Foo")) {
            return true;
        } else return false;
    } else return false;
}

次のコードを生成します。

  static boolean x(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        15
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       

  static boolean y(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        17
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       
      17: iconst_0      
      18: ireturn       

elseしたがって、無関係なジャンプターゲットを除けば、コードは同じです。あなたも持っていない場合else

static boolean z(String a) {
    if (a != null) {
        if (a.equals("Foo"))
            return true;
    return false;
}

その場合、結果は実際には同じです。

  static boolean z(java.lang.String);
    Code:
       0: aload_0       
       1: ifnull        15
       4: aload_0       
       5: ldc           #16                 // String Foo
       7: invokevirtual #21                 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
      10: ifeq          15
      13: iconst_1      
      14: ireturn       
      15: iconst_0      
      16: ireturn       
于 2012-06-08T08:02:39.437 に答える
9

他のみんなが言ったように、パフォーマンスに違いはないはずです。小さなヒント-ほとんどの場合、nullの場合はfalseを返すinstanceofを呼び出します。だから書く:

if( !"".equals(foo)) {...}

同じチェックを行い、nullセーフです。

于 2012-06-08T08:17:14.927 に答える
2

どちらもパフォーマンスの点で違いはありません。最初のケースでは1つの条件をチェックするため、失敗した場合は内部に入りません。2番目のケースでも、JVMは最初の条件をチェックします。falseが返された場合、JVMは2番目のチェックに進むことはありません。最初がfalseの場合、論理&&演算子は常にfalseになります。

コーディング標準に関しては、コーディング行の数が少ないため、2番目のオプションを選択します。

于 2012-06-08T08:07:21.350 に答える
1

コンパイル時に最適化を実行するため、bytcode生成されたものは最適化される可能性があります。if(sample!=null && !sample.equals(""))java

あなたが書いた実際のコードについて話しているのなら、1つだけ持っている方が良いifです。2つの構造はifコンパイラーにとってより複雑であるため(最適化なし)。これを裏付ける経験的なデータはありませんが。

于 2012-06-08T08:04:09.090 に答える