2009-03-10 16 views
21

Wiem o Arrays.deepEquals (Object [], Object []), ale to nie działa dla typów pierwotnych (z powodu ograniczeń macierzy i autoboxingu, patrz this related post).Porównać dwie tablice prymitywów w Javie?

Czy to jest najbardziej efektywne podejście?

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

Odpowiedz

33

Zmień swoje pierwsze porównanie być:

if (a == b) 
    return true; 

Ten łapie nie tylko „null” zarówno przypadki, ale także „porównać tablicę do siebie” sprawy.

Jednak dla prostszej alternatywy - użyj Arrays.equals, która ma przeciążenia dla każdego typu pierwotnego. (Implementacja jest bardzo podobna do twojej, z wyjątkiem tego, że wyciąga długość macierzy z pętli .NET, który może być antyoptymalizacją, ale myślę, że implementatorzy bibliotek JRE prawdopodobnie wiedzą lepiej dla JVM :)

+2

Zostałem skulony! –

+0

Pomyślałem, że istnieje metoda biblioteczna, ale tweakt wyrzucił mnie, wspominając deepEquals() tuż przy kiju. Arrays.equals() robi dokładnie to samo, co ta metoda z twoją zmianą, chociaż przechowuje również długość w zmiennej tymczasowej (przed porównywaniem długości). –

+0

Dzięki! I wiedziałem o tym trochę, dzięki za przypomnienie mi ... człowiek SO sprawił, że jestem leniwy! –

15

Myślę, że najbardziej efektywne powinno być użycie metod pomocniczych w klasie Arrays, ponieważ mogą być one zaimplementowane bardziej sprytnie. Więc w tym przypadku należy użyć

Arrays.equals(a, b); 
0

Nie wiem, czy to pomoże nikomu, ale to wydaje się działać:

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

Widocznie array.equals(otherArray) robi array == otherArray, a nie to, czego się spodziewać .