java.util.Arrays.equals(),长度有限

Rom*_*nko 3 java arrays containers

我需要比较两个byte []数组的元素,但只能达到固定长度.对于我使用的整个阵列java.util.Arrays.equals().当然我可以复制子范围(Arrays.copyOf()),但我不想这样做.我也确信在没有新的实用程序方法实现的情况下应该有标准的方法.

我正式需要的是:

java.util.Arrays.equals(byte[] a, byte [] b, int length)
Run Code Online (Sandbox Code Playgroud)

有什么意义吗?我没有看到广泛使用的方法.

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

先感谢您.

Rom*_*nko 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

@meriton回答的属性:

  • 结果是使用它们的全部功能的收集.
  • 实际上它有点复制(但不完整).
  • 需要引用,基元不能以这种方式包装.

这个答案很特别.

  • 后端数组不会以任何方式更改.ByteBuffer.array()返回对原始数组的引用(可能是不利的,可能是有利的).
  • 它适用于原语.


mer*_*ike 7

你可以这样做:

Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n))
Run Code Online (Sandbox Code Playgroud)

  • 对于`int a [] = {1};`,`int b [] = {2,3,4};`和`int n = 2;`它抛出`java.lang.IndexOutOfBoundsException:toIndex = 2`,根据[Javadoc](http://docs.oracle.com/javase/7/docs/api/java/util/List.html)`subList()`抛出`IndexOutOfBoundsException - 表示非法端点索引值(fromIndex < 0 || toIndex> size || fromIndex> toIndex)`. (2认同)

Ale*_* C. 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;
    }
Run Code Online (Sandbox Code Playgroud)


Bab*_*New 5

这个特性是在 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);
Run Code Online (Sandbox Code Playgroud)