Confronta due matrici di primitivi in ​​Java?

Conosco Arrays.deepEquals (Object [], Object []) ma questo non funziona per i tipi primitivi (a causa delle limitazioni degli array e dell’autoboxing, vedi questo post correlato ).

Con questo in mente, è questo l’approccio più efficiente?

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

Cambia il tuo primo confronto per essere:

 if (a == b) return true; 

Questo non solo cattura i casi “entrambi nulli”, ma anche “confronta un array con se stesso”.

Tuttavia, per un’alternativa più semplice – usa Arrays.equals che ha sovraccarichi per ogni tipo primitivo. (L’implementazione è molto simile alla tua, tranne che estrae la lunghezza dell’array dal ciclo. NET può essere un anti-ottimizzazione, ma suppongo che gli implementatori della libreria JRE probabilmente conoscano meglio la JVM 🙂

Penso che il modo più efficace dovrebbe essere usare i metodi helper nella class Arrays , perché potrebbero essere implementati in modo più intelligente. Quindi in questo caso, usa

 Arrays.equals(a, b); 

Non so se questo aiuterà qualcuno, ma questo sembra funzionare:

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

Apparentemente array.equals(otherArray) fa un array == otherArray , e non quello che ci si aspetterebbe.