Frage

Ich weiß, über Arrays.deepEquals (Object [], Object []), aber das funktioniert nicht für primitive Typen (wegen Einschränkungen von Arrays und Autoboxing finden Sie unter dieses Ergebniss zu ).

In diesem Sinne ist dies der effizienteste Ansatz?

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;
}
War es hilfreich?

Lösung

ändern Sie Ihren ersten Vergleich zu sein:

if (a == b)
    return true;

Das fängt nicht nur die „beide null“ Fälle, sondern auch Fall „einen Array selbst vergleichen“.

Doch für eine einfachere Alternative - verwenden Arrays.equals die Überlastungen für jeden primitiven Typ hat. (Die Implementierung ist sehr ähnlich wie bei Ihnen, außer es die Array-Länge aus der Schleife hisst auf .NET, die eine anti-Optimierung sein können, aber ich denke, die JRE Bibliothek Implementierer wahrscheinlich für die JVM besser wissen.)

Andere Tipps

Ich denke, die effizienteste sein sollte, die Helfermethoden in der Arrays Klasse, weil sie klug umgesetzt werden könnten. Also in diesem Fall verwenden

Arrays.equals(a, b);

Ich weiß nicht, ob dies jemand helfen wird, aber dies scheint zu funktionieren:

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

Offenbar array.equals(otherArray) hat eine array == otherArray, und nicht das, was man erwarten würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top