在Java中比较两个原始数据类型的数组?

20

我知道Arrays.deepEquals(Object[], Object[]),但对于基本类型不起作用(由于数组和自动装箱的限制,详见此相关帖子)。

在这种情况下,这是最有效的方法吗?

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;
}
3个回答

37

将你的第一个比较改为:

if (a == b)
    return true;

这不仅可以捕获“两个都为空”的情况,还可以捕获“将数组与自身进行比较”的情况。

然而,对于一个更简单的替代方案 - 使用Arrays.equals,它为每种原始类型提供了重载。 (实现与您的非常相似,只是它将数组长度提升出循环。在.NET上,这可能会导致反优化,但我想JRE库实现者可能更了解JVM :)


我原以为有一个库方法,但是Tweakt一开始就提到了deepEquals(),让我感到困惑。Arrays.equals()正好做了这个方法所做的事情,尽管它还将a.length存储在临时变量中(在比较长度之前)。 - Michael Myers
你可能会发现虚拟机忽略库中的实现并内联自己的实现。 - Tom Hawtin - tackline

15

我认为最有效的方法应该是使用Arrays类中的辅助方法,因为它们可能会实现得更加聪明。所以在这种情况下,使用:

Arrays.equals(a, b);

0

我不知道这是否会对任何人有所帮助,但这似乎是有效的:

        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,而不是你期望的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接