如何比较Java Byte[] 数组?

124
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));
    }
}

我不知道为什么它们都打印出false。

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

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


1
可能是比较两个字节数组?(Java)的重复问题。 - Vadzim
Arrays.equals可以正常工作。在此处运行并检查 https://onecompiler.com/java/3wc4ec2su - karthikdivi
16个回答

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

0

你还可以使用来自Apache DirectoryByteArrayComparator。除了equals,它还可以让你比较一个数组是否大于另一个数组。


0

我在寻找一个数组包装器,使其可以与guava TreeRangeMap一起使用。该类不接受比较器。

经过一些研究,我意识到JDK中的ByteBuffer具有此功能,并且它不会复制原始数组,这很好。 此外,您可以使用ByteBuffer::asLongBuffer每次8个字节更快地进行比较(也不会复制)。默认情况下,ByteBuffer::wrap(byte[])使用BigEndian,因此顺序关系与比较单个字节相同。

.


0

你也可以使用 org.apache.commons.lang.ArrayUtils.isEquals()


0
作为一种较新的解决方案,你可以使用
import org.junit.jupiter.api.Assertions.*

assertArrayEquals(aa,bb);

-5

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

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

3
“更快”指的是“更慢”。 - divegeek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接