Pergunta

Eu sei sobre Arrays.deepEquals (Object [], Object []), mas isso não funciona para tipos primitivos (devido limitações de matrizes e autoboxing, consulte este post relacionado ).

Com isso em mente, é esta a abordagem mais eficiente?

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;
}
Foi útil?

Solução

Mude sua primeira comparação a ser:

if (a == b)
    return true;

Isto não só pega os casos "ambos nulos", mas também "comparar uma matriz para si" caso.

No entanto, para uma simples alternativa - use Arrays.equals que tem sobrecargas para cada tipo primitivo. (A implementação é muito semelhante ao seu, a não ser que iça o comprimento de matriz fora do circuito No .NET que pode ser um anti-otimização, mas acho que os implementadores da biblioteca JRE provavelmente sabe melhor para o JVM:.)

Outras dicas

Eu acho que o mais eficiente deve ser o de usar os métodos auxiliares na Arrays classe, porque eles podem ser implementadas de forma mais inteligente. Portanto, neste caso, o uso

Arrays.equals(a, b);

Eu não sei se isso vai ajudar ninguém, mas isso parece estar funcionando:

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

Aparentemente array.equals(otherArray) faz um array == otherArray, e não o que você esperaria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top