2009-03-10 10 views
21

Ich kenne Arrays.deepEquals (Object [], Object []), aber dies funktioniert nicht für primitive Typen (fällige Einschränkungen von Arrays und Autoboxing, siehe this related post).Vergleichen Sie zwei Arrays von Primitiven in Java?

In diesem Sinne, ist dies der effizienteste Ansatz?

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; 
} 

Antwort

33

ändern Sie Ihren ersten Vergleich zu sein:

if (a == b) 
    return true; 

Das ist nicht nur die „beide null“ Fälle, sondern auch fängt Fall „um mich selbst ein Array vergleichen“.

Für eine einfachere Alternative - verwenden Sie Arrays.equals, die für jeden primitiven Typ überladen hat. (Die Implementierung ist Ihrer sehr ähnlich, außer dass sie die Array-Länge aus der Schleife hebt. Auf .NET, das eine Anti-Optimierung sein kann, aber ich denke, die JRE-Bibliotheks-Implementatoren wissen wahrscheinlich besser für die JVM :)

+2

Ich wurde Skeeted! –

+0

Ich dachte, es gäbe eine Bibliotheksmethode, aber zwickt mich, indem ich deepEquals() auf Anhieb erwähnte. Arrays.equals() macht genau das, was diese Methode mit Ihrer Änderung macht, speichert aber auch a.length in einer temporären Variable (vor dem Vergleich der Längen). –

+0

Danke! Und ich wusste einiges davon, danke, dass du mich daran erinnert hast ... der Mensch hat mich faul gemacht! –

15

Ich denke, am effizientesten sollte es sein, die Hilfsmethoden in der Klasse Arrays zu verwenden, weil sie vielleicht cleverer implementiert werden könnten. Also in diesem Fall verwenden

Arrays.equals(a, b); 
0

Ich weiß nicht, ob dies jemand helfen wird, aber dies scheint zu funktionieren:

 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; 
      } 
     } 

Offenbar hat array.equals(otherArray) ein array == otherArray, und nicht das, was man erwarten würde .