如何比较两个Java数组的前n个字节?

Boo*_*Boo 3 java arrays

我需要比较两个不同的java byte []数组的前n个字节。有Arrays equals()函数,但是它首先测试数组的长度,之后测试整个数组的长度,而我的数组的长度是不同的,所以这不好。

除了手动编写自己的循环以外,还有其他想法吗?

谢谢,

Ros*_*rew 5

您为什么不想手工编写自己的循环?您可以只将数组复制出一个子集,然后再次使用它进行比较:-

byte[] a1 = Arrays.copyOfRange(array1, 0, n);
byte[] a2 = Arrays.copyOfRange(array2, 0, n);
boolean equal = Arrays.equals(a1, a2);
Run Code Online (Sandbox Code Playgroud)

如果需要考虑效率,那么System.arraycopy是一种更快但更冗长的复制数组的方式。

如果效率真的是一个问题,而不是冗长,那么循环可能是最好的方法。

 boolean matched = true;
 for (int i=0; i<n; i++){
   if (array1[i] != array2[i]) {
     matched = false;
     break;
   }
 }
Run Code Online (Sandbox Code Playgroud)

这是因为您可以在看到不匹配的字节后立即停止搜索。如果第一个字节不匹配并且我们正在比较100个字节,则在第一个解决方案中,我们将在后台复制2个100个字节,创建两个100个字节的数组,然后比较100个字节集,尽管它会停在第一个。在循环中,这是循环中的一次迭代,发现,标记不匹配,然后完成。

Java 8(更新)

通过创建要比较的索引号(使用IntStream),并使用比较流中每个索引处的两个数组的谓词对流进行allMatch,可以更简洁地用Java 8语法完成上述操作。所以:-

//Both arrays must match at all indices between 0 and n
boolean matched = IntStream.range(0, n).allMatch(i -> array1[i] == array2[i]);
//...Of course if you are comparing non simple types, you would need to use equals()
Run Code Online (Sandbox Code Playgroud)