如何比较Java Byte 数组?

public class ByteArr { public static void main(String[] args){ Byte[] a = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; Byte[] b = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; byte[] aa = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; byte[] bb = {(byte)0x03, (byte)0x00, (byte)0x00, (byte)0x00}; System.out.println(a); System.out.println(b); System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(aa); System.out.println(bb); System.out.println(aa == bb); System.out.println(aa.equals(bb)); } } 

我不知道为什么他们都打印错误。

当我运行“java ByteArray”时,答案是“false false false false”。

我认为a []等于b [],但JVM告诉我我错了,为什么?

12 Solutions collect form web for “如何比较Java Byte 数组?”

如果要比较包含原始types值(如字节)的数组的实际内容,请使用Arrays.equals() )。

 System.out.println(Arrays.equals(aa, bb)); 

使用Arrays.deepEquals比较包含对象的数组。

因为他们不相等,即:他们是不同的数组里面有相同的元素。

尝试使用Arrays.equals()Arrays.deepEquals()

由于byte []是可变的,如果它是相同的对象,它将被视为只是.equals()

如果你想比较内容,你必须使用Arrays.equals(a, b)

顺便说一句:它不是我devise它的方式。 ;)

你看过Arrays.equals()吗?

编辑:如果,根据您的评论,问题是使用一个字节数组作为HashMap键,然后看到这个问题 。

如果你想将数组作为一个通用的HashMap键,那就不行了。 考虑创build一个包含数组的自定义包装器对象,其equals(...)hashcode(...)方法返回java.util.Arrays方法的结果。 例如…

 import java.util.Arrays; public class MyByteArray { private byte[] data; // ... constructors, getters methods, setter methods, etc... @Override public int hashCode() { return Arrays.hashCode(data); } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; MyByteArray other = (MyByteArray) obj; if (!Arrays.equals(data, other.data)) return false; return true; } } 

这个包装类的对象将作为你的HashMap<MyByteArray, OtherType> ,并将允许干净的使用equals(...)hashCode(...)方法。

因为==和数组的equals()方法都不比较内容; 只有评估对象的身份。

为了比较内容,使用Arrays.equals()

他们返回false是因为您正在testing对象标识而不是值相等。 这将返回false,因为你的数组实际上是内存中不同的对象。

如果要testing值是否相等,应该使用java.util.Arrays中的方便的比较函数

例如

 import java.util.Arrays; ''''' Arrays.equals(a,b); 

您也可以使用Apache Directory中的ByteArrayComparator 。 除了等于它可以让你比较一个数组是否大于另一个。

试试这个:

 boolean blnResult = Arrays.equals(byteArray1, byteArray2); 

我也不确定这一点,但尝试这可能是有效的。

为什么一个[]不等于b []? 因为equals函数实际上在Byte[]Byte[]上调用的是Object.equals(Object obj) 。 这个函数只比较对象标识,不要比较数组的内容。

我查找了一个数组包装器,可以和guava TreeRangeMap一起使用。 class级不接受比较。

经过一番研究,我意识到来自JDK的ByteBuffer具有这个特性,并且不会复制原来的数组。 你可以比ByteBuffer :: asLongBuffer更快的比较8个字节(也不会复制)。 默认情况下,ByteBuffer :: wrap(byte [])使用BigEndian,所以顺序关系和比较单个字节是一样的。

有一个更快的方法来做到这一点:

 Arrays.hashCode(arr1) == Arrays.hashCode(arr2)