如何比较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告诉我我错了,为什么?
如果要比较包含原始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)