سؤال

وأنا أعلم عن Arrays.deepEquals (كائن []، كائن [])، ولكن هذا لا يعمل لأنواع بدائية (القيود بسبب صفائف وautoboxing، انظر> وأ href = "https://stackoverflow.com/questions / 517751 / جافا عام-طريقة ولكن مصفوفة من بين البدائية-أنواع البيانات لا-لا-autobox "> هذه الوظيفة ذات الصلة ).

ومع أخذ ذلك في الاعتبار، وهذا هو النهج الأكثر كفاءة؟

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;
}
هل كانت مفيدة؟

المحلول

وتغيير المقارنة الأولى لتكون:

if (a == b)
    return true;

وهذا يمسك ليس فقط الحالات "على حد سواء لاغية"، ولكن أيضا "مقارنة مجموعة لنفسها" القضية.

ولكن، عن بديل أكثر بساطة - استخدام <لأ href = "http://java.sun.com/javase/6/docs/api/java/util/Arrays.html#equals(byte[]،٪20byte []) "يختلط =" noreferrer "> Arrays.equals التي لديها الزائدة لكل نوع بدائي. (تنفيذ هي مشابهة جدا للك، إلا أنها المصاعد طول مجموعة من حلقة في NET التي يمكن أن تكون مضادة للتحسين، ولكن اعتقد ان المنفذين مكتبة JRE ربما نعرف أفضل للJVM:)

نصائح أخرى

وأعتقد أن الأكثر فعالية يجب أن يكون لاستخدام أساليب المساعد في في فئة صالحة ، لأنها يمكن أن تنفذ أكثر بذكاء. حتى في هذه الحالة، استخدم

Arrays.equals(a, b);

وأنا لا أعرف إذا كان هذا سيساعد أي شخص، ولكن يبدو أن هذا العمل:

        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) يقوم array == otherArray، وليس ما كنت تتوقع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top