2009-03-10 19 views
21

私はArrays.deepEquals(Object []、Object [])について知っていますが、これはプリミティブ型(配列とオートボクシングの制限により、this related post参照)では機能しません。Javaのプリミティブの2つの配列を比較しますか?

これを念頭に置いて、これが最も効果的なアプローチですか?

boolean byteArrayEquals(byte[] a, byte[] b) { 
    if (a == null && b == null) 
     return true; 

    if (a == null || b == null) 
     return false; 

    if (a.length != b.length) 
     return false; 

    for (int i = 0; i < a.length; i++) { 
     if (a[i] != b[i]) 
      return false; 
    } 
    return true; 
} 

答えて

33
は、なるように、あなたの最初の比較を変更

if (a == b) 
    return true; 

これは、「両方ともNULL」の場合をキャッチするだけでなく、ケースを「自分自身への配列を比較する」だけではなく。

ただし、単純な代替方法として、Arrays.equalsにはプリミティブタイプごとにオーバーロードがあります。 (実装は非常に似ていますが、ループから配列の長さを引き上げる点を除きます。アンチ最適化することができる.NETでは、JREライブラリの実装者はおそらくJVMの方が良いでしょうね:)

+2

私はSkeetedされました! –

+0

私はライブラリメソッドがあると思っていましたが、tweaktはバットからdeepEquals()を記述することで私を捨てました。 Arrays.equals()は、このメソッドを変更したものと全く同じことを行いますが、長さを比較する前にa.lengthを一時変数に格納します。 –

+0

ありがとう!そして私はこれを知っていました。私に思い出させてくれてありがとう。 –

15

私は最も効率的なのは、Arraysクラスのヘルパーメソッドを使うべきだと思います。なぜなら、彼らはもっと巧みに実装されるかもしれないからです。したがって、この場合には、

Arrays.equals(a, b); 
0

を使用し、これは誰にも役立つかどうかは知りませんが、これは動作しているようだ:

 if(type == type_BooleanArray) { 
      boolean eq = Arrays.equals((boolean[]) thisObj, (boolean[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_ByteArray) { 
      boolean eq = Arrays.equals((byte[]) thisObj, (byte[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_ShortArray) { 
      boolean eq = Arrays.equals((short[]) thisObj, (short[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_CharArray) { 
      boolean eq = Arrays.equals((char[]) thisObj, (char[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_IntArray) { 
      boolean eq = Arrays.equals((int[]) thisObj, (int[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_LongArray) { 
      boolean eq = Arrays.equals((long[]) thisObj, (long[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_FloatArray) { 
      boolean eq = Arrays.equals((float[]) thisObj, (float[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else if(type == type_DoubleArray) { 
      boolean eq = Arrays.equals((double[]) thisObj, (double[]) thatObj); 
      if(!eq) { 
       return false; 
      } 
     } else { 
      if(!thisObj.equals(thatObj)) { 
       return false; 
      } 
     } 

どうやらarray.equals(otherArray)は、あなたが期待するものarray == otherArray、とはしません。