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

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

我正式需要的是:

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

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

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

先谢谢你。

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的属性回答:

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

这个答案很特别。

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

你可以这样做:

 Arrays.asList(a).subList(0,n).equals(Arrays.asList(b).subList(0,n)) 

您可以通过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 

为什么不自己轻易实现呢?

 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; 

在Java 9中添加了此function。给定数组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);