我有一个带有〜已知二进制序列的字节数组。我需要确认二进制序列是它应该是什么。除了.equals
之外,我还尝试了==
,但都没有奏效。
byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
if (new BigInteger("1111000011110001", 2).toByteArray() == array){
System.out.println("the same");
} else {
System.out.println("different'");
}
答案 0 :(得分:160)
在您的示例中,您有:
if (new BigInteger("1111000011110001", 2).toByteArray() == array)
在处理对象时,java中的==
会比较参考值。您正在检查toByteArray()
返回的数组引用是否与array
中引用的引用相同,这当然永远不会成立。此外,数组类不会覆盖.equals()
,因此行为是Object.equals()
的行为,它也只比较参考值。
为了比较两个数组的内容,Arrays class提供了静态数组比较方法
byte[] array = new BigInteger("1111000011110001", 2).toByteArray();
byte[] secondArray = new BigInteger("1111000011110001", 2).toByteArray();
if (Arrays.equals(array, secondArray))
{
System.out.println("Yup, they're the same!");
}
答案 1 :(得分:63)
查看静态java.util.Arrays.equals()
系列方法。有一个完全符合您的要求。
答案 2 :(得分:11)
Java不会重载运算符,因此通常需要一种非基本类型的方法。试试Arrays.equals()方法。
答案 3 :(得分:9)
您可以同时使用Arrays.equals()
和MessageDigest.isEqual()
。这两种方法虽然存在一些差异。
MessageDigest.isEqual()
是一种时间常数比较方法,Arrays.equals()
是非时间常数,如果您在安全应用程序中使用它,可能会带来一些安全问题。
答案 4 :(得分:3)
当然,Arrays.equal(byte [] first,byte [] second)的接受答案是正确的。 我喜欢在较低级别工作,但我无法找到执行相等测试范围的低级别高效功能。如果有人需要,我不得不鞭打我自己:
public static boolean ArraysAreEquals(
byte[] first,
int firstOffset,
int firstLength,
byte[] second,
int secondOffset,
int secondLength
) {
if( firstLength != secondLength ) {
return false;
}
for( int index = 0; index < firstLength; ++index ) {
if( first[firstOffset+index] != second[secondOffset+index]) {
return false;
}
}
return true;
}
答案 5 :(得分:0)
由于我想比较一个单元测试的两个数组,因此得出了我认为可以分享的答案。
您也可以使用以下方法做到这一点:
["d"]
您可以在Comparing arrays in JUnit assertions上查看更多信息。