Objects中的方法深比較:deepEquals

Objects中的方法深比較:deepEquals
Objects於Object類似於Collections對於Collection,它有一些非常有意思的方法,值得我們看一下,這裏我們看下Objects的deepEquals方法。
比較兩個對象是否相等,我們一般直接比較地址(equals()默認就是比較地址),
但是有的時候,我們想比較兩個數組是否相同,直接比較地址顯然不合適,這時除了重寫equals,我們可以選擇deepEequals() 。
源碼如下:

public static boolean deepEquals(Object a, Object b) {
        if (a == b)
            return true;
        else if (a == null || b == null)
            return false;
        else
            return Arrays.deepEquals0(a, b);
    }
    

源碼中,我們可以看出deepEquals() 首先還是比較兩個對象的地址,這與equals方法一樣,直接看第三個else中的代碼塊,Objects的deepEquals()是基於Arrays的deepEquals0()實現的,代碼如下:

static boolean deepEquals0(Object e1, Object e2) {
        assert e1 != null;
        boolean eq;
        if (e1 instanceof Object[] && e2 instanceof Object[])
            eq = deepEquals ((Object[]) e1, (Object[]) e2);
        else if (e1 instanceof byte[] && e2 instanceof byte[])
            eq = equals((byte[]) e1, (byte[]) e2);
        else if (e1 instanceof short[] && e2 instanceof short[])
            eq = equals((short[]) e1, (short[]) e2);
        else if (e1 instanceof int[] && e2 instanceof int[])
            eq = equals((int[]) e1, (int[]) e2);
        else if (e1 instanceof long[] && e2 instanceof long[])
            eq = equals((long[]) e1, (long[]) e2);
        else if (e1 instanceof char[] && e2 instanceof char[])
            eq = equals((char[]) e1, (char[]) e2);
        else if (e1 instanceof float[] && e2 instanceof float[])
            eq = equals((float[]) e1, (float[]) e2);
        else if (e1 instanceof double[] && e2 instanceof double[])
            eq = equals((double[]) e1, (double[]) e2);
        else if (e1 instanceof boolean[] && e2 instanceof boolean[])
            eq = equals((boolean[]) e1, (boolean[]) e2);
        else
            eq = e1.equals(e2);
        return eq;
    }

源碼中先判斷要比較的對象是不是常見的數組類型(byte[]、short[]、int[]、long[]、char[]、float[]、double[]、boolean[]),是的話,就調用Arrays類中equals()方法,逐個對數組元素比較:

public static boolean equals(boolean[] a, boolean[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

如果比較對象是object[],則是調用Arrays的deepEquals()方法進行比較:對象比較多了個非null判斷,for裏面判斷對象是否相等,最終還是調用的Object的equals()方法:

public static boolean deepEquals(Object[] a1, Object[] a2) {
        if (a1 == a2)
            return true;
        if (a1 == null || a2==null)
            return false;
        int length = a1.length;
        if (a2.length != length)
            return false;

        for (int i = 0; i < length; i++) {
            Object e1 = a1[i];
            Object e2 = a2[i];

            if (e1 == e2)
                continue;
            if (e1 == null)
                return false;

            // Figure out whether the two elements are equal
            boolean eq = deepEquals0(e1, e2);

            if (!eq)
                return false;
        }
        return true;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章