Подтвердить что ты не робот

Сравнить два массива примитивов в Java?

Я знаю о Arrays.deepEquals(Object [], Object []), но это не работает для примитивных типов (из-за ограничений массивов и autoboxing, см. этот связанный пост).

С учетом этого, является ли это наиболее эффективным подходом?

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

Ответ 1

Измените свое первое сравнение:

if (a == b)
    return true;

Это не только захватывает "оба нулевых" случая, но также и "сравнивает массив с самим собой".

Однако для более простой альтернативы используйте Arrays.equals, который имеет перегрузки для каждого примитивного типа. (Реализация очень похожа на вашу, за исключением того, что она вытягивает длину массива из цикла. В .NET, который может быть анти-оптимизацией, но я думаю, что разработчики библиотеки JRE, вероятно, лучше знают JVM:)

Ответ 2

Я думаю, что наиболее эффективным должно быть использование вспомогательных методов в классе Arrays, потому что они могут быть реализованы более умно. Поэтому в этом случае используйте

Arrays.equals(a, b);

Ответ 3

Я не знаю, поможет ли это кому-либо, но это, похоже, работает:

        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) делает a array == otherArray, а не то, что вы ожидаете.