2009-03-10 61 views
21

Tôi biết về Arrays.deepEquals (Object [], Object []) nhưng điều này không làm việc cho các kiểu nguyên thủy (do hạn chế của mảng và autoboxing, xem this related post).So sánh hai mảng nguyên thủy trong Java?

Với ý nghĩ đó, đây có phải là phương pháp hiệu quả nhất không?

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

Trả lời

33

Thay đổi so sánh đầu tiên của bạn là:

if (a == b) 
    return true; 

Điều này không chỉ bắt "cả null" trường hợp, nhưng cũng "so sánh một mảng với chính nó" hợp cụ thể.

Tuy nhiên, để thay thế đơn giản hơn - hãy sử dụng Arrays.equals có quá tải cho từng loại nguyên thủy. (Việc cài đặt rất giống với của bạn, ngoại trừ nó kéo dài độ dài mảng ra khỏi vòng lặp. Trên .NET có thể là một tối ưu hóa chống lại, nhưng tôi đoán những người triển khai thư viện JRE có thể hiểu rõ hơn về JVM :)

+2

Tôi đã bị Skeeted! –

+0

Tôi nghĩ rằng có một phương pháp thư viện, nhưng tinh chỉnh đã ném tôi đi bằng cách đề cập đến deepEquals() ngay lập tức. Arrays.equals() thực hiện chính xác phương thức này với thay đổi của bạn, mặc dù nó cũng lưu trữ a.length trong một biến tạm thời (trước khi so sánh độ dài). –

+0

Cảm ơn! Và tôi biết một số điều này, cảm ơn đã nhắc tôi ... người đàn ông SO đã khiến tôi lười biếng! –

15

Tôi nghĩ rằng hiệu quả nhất nên được sử dụng các phương pháp trợ giúp trong lớp Arrays, bởi vì chúng có thể được thực hiện khéo léo hơn. Vì vậy, trong trường hợp này, sử dụng

Arrays.equals(a, b); 
0

Tôi không biết nếu điều này sẽ giúp bất cứ ai, nhưng điều này dường như được làm việc:

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

Rõ ràng array.equals(otherArray) nào một array == otherArray, và không phải những gì bạn mong đợi .