3

我需要比较两个 byte[] 数组的元素,但最多只能是固定长度。对于我使用的整个数组java.util.Arrays.equals()。当然,我可以复制子范围 ( Arrays.copyOf()),但我不想这样做。我也确信应该有标准的方法来做到这一点,而不需要新的实用方法实现。

我正式需要的是:

java.util.Arrays.equals(byte[] a, byte [] b, int length)

有什么众所周知的事情吗?我没有看到广泛使用的方法。

再次关于防止错误答案的要求: - 数组等于长度限制。- 我有手动实现,但我想用标准的东西代替它。- 我不想要任何副本。

先感谢您。

4

5 回答 5

9

ByteBuffer 提供了类似于@meriton 提出的东西,但可以使用原语。这是说明性代码:

import java.nio.ByteBuffer;

public class Main {

    public static void main(String [] args) throws Exception {

        byte [] a1 = {0, 1, 0, 1};
        byte [] a2 = {0, 0, 1, 0};

        boolean eq = ByteBuffer.wrap(a1,0,3).equals(ByteBuffer.wrap(a2,1,3));
        System.out.println("equal: " + eq);
    }
}

@meriton 答案的属性:

  • 结果是收集与使用它们的全部力量。
  • 实际上它有点复制(但不是完整的)。
  • 需要引用,不能以这种方式包装原语。

这个答案特价。

  • 后端数组不会以任何方式更改。ByteBuffer.array()返回对原始数组的引用(可能是劣势,也可能是优势)。
  • 它适用于原语。
于 2013-05-20T14:00:05.060 回答
7

你可以这样做:

Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n))
于 2013-05-20T10:03:59.033 回答
6

您可以通过 Arrays.equals 的源代码来建立您的方法。

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

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

        return true;
    }
于 2013-05-20T10:02:44.443 回答
6

Java 9 中添加了此功能。给定数组 a 和数组 b,您将执行以下操作:

//with char array
    Arrays.compare(a, startIndex_A, endIndex_A, b, startIndex_B, endIndex_B);

//with byte, short, int, long arrays
    Arrays.compareUnsigned(a, startIndex_A, endIndex_A, b, startIndex_B, endIndex_B);
于 2018-05-29T12:35:17.723 回答
1

为什么不自己简单地实现它呢?

public static void firstNEqual(byte[] a, byte[] b, int n) {
    assert a.length >= n && b.length >= n;

    for(int i = 0; i < n; i++)
        if(a[i] != b[i])
            return false;
    return true;
}

是什么让您认为应该内置一个实用方法?如果我的情况是a[1:4] == b[0:3]?是否更易读Arrays.subrangesEqual(a, b, 1, 0, 3),或者作为显式的 for 循环:

for(int i = 1, j = 0, count = 0; count < 3; count++, i++, j++)
    if(a[i] != b[j])
        return false;
return true;
于 2013-05-20T10:01:11.093 回答