簡體   English   中英

比較 Java 中原語的兩個 arrays?

[英]Compare two arrays of primitives in Java?

我知道 Arrays.deepEquals(Object[], Object[]) 但這不適用於原始類型(由於 arrays 和自動裝箱的限制,請參閱此相關帖子)。

考慮到這一點,這是最有效的方法嗎?

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;

這不僅捕獲了“都為空”的情況,而且還捕獲了“將數組與其自身進行比較”的情況。

但是,對於更簡單的替代方案 - 使用Arrays.equals ,它對每種原始類型都有重載。 (實現與您的非常相似,除了它將數組長度提升到循環之外。在 .NET 上,這可能是一種反優化,但我猜 JRE 庫實現者可能更了解 JVM :)

我認為最有效的應該是使用Arrays class 中的輔助方法,因為它們可能會更巧妙地實現。 所以在這種情況下,使用

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM