如何比较Java Byte []数组?

时间:2012-02-29 12:55:51

标签: java

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告诉我我错了,为什么?

15 个答案:

答案 0 :(得分:171)

如果要比较包含基本类型值(如byte)的数组的实际内容,请使用Arrays.equals()

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

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

答案 1 :(得分:5)

因为它们不相等,即:它们是内部具有相同元素的不同数组。

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

答案 2 :(得分:3)

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

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

顺便说一下:这不是我设计它的方式。 ;)

答案 3 :(得分:1)

你看过Arrays.equals()吗?

编辑:如果根据您的评论,问题是使用字节数组作为HashMap密钥,请参阅this question

答案 4 :(得分:1)

如果您尝试将该数组用作通用HashMap键,那么这不会起作用。考虑创建一个包含数组的自定义包装器对象,其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(...)方法。

答案 5 :(得分:0)

因为数组的==equals()方法都没有比较内容;两者都只评估对象标识(==总是这样,并且equals()未被覆盖,因此正在使用Object的版本。)

要比较内容,请使用Arrays.equals()

答案 6 :(得分:0)

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

如果要测试值相等,请使用java.util.Arrays

中的便捷比较函数

e.g。

import java.util.Arrays;

'''''

Arrays.equals(a,b);

答案 7 :(得分:0)

尝试这个:

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

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

答案 8 :(得分:0)

您还可以使用Apache Directory中的ByteArrayComparator。除了等于之外,它还可以让您比较一个数组更大而不是另一个数组。

答案 9 :(得分:0)

为什么[]不等于b []? 因为equals真正调用的Byte[]函数或byte[]Object.equals(Object obj)。此函数仅比较对象标识,不比较数组的内容。

答案 10 :(得分:0)

我找了一个数组包装器,它可以与guava TreeRangeMap一起使用。该班不接受比较。

经过一番研究后,我意识到JDK的ByteBuffer有这个功能,它不会复制好的原始数组。 更多的是你可以更快地与ByteBuffer :: asLongBuffer比较8个字节(也不复制)。默认情况下,ByteBuffer :: wrap(byte [])使用BigEndian,因此顺序关系与比较单个字节相同。

答案 11 :(得分:0)

Java字节比较,

public static boolean equals(byte[] a, byte[] a2) {
        if (a == a2)
            return true;
        if (a == null || a2 == null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i = 0; i < length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

答案 12 :(得分:0)

您还可以使用org.apache.commons.lang.ArrayUtils.isEquals()

答案 13 :(得分:0)

Arrays.equals对于比较器来说是不够的,您不能检查包含数据的映射。我从Arrays.equals复制代码,并对其进行了修改以构建Comparator

class ByteArrays{
    public static <T> SortedMap<byte[], T> newByteArrayMap() {
        return new TreeMap<>(new ByteArrayComparator());
    }

    public static SortedSet<byte[]> newByteArraySet() {
        return new TreeSet<>(new ByteArrayComparator());
    }

    static class ByteArrayComparator implements Comparator<byte[]> {
        @Override
        public int compare(byte[] a, byte[] b) {
            if (a == b) {
                return 0;
            }
            if (a == null || b == null) {
                throw new NullPointerException();
            }

            int length = a.length;
            int cmp;
            if ((cmp = Integer.compare(length, b.length)) != 0) {
                return cmp;
            }

            for (int i = 0; i < length; i++) {
                if ((cmp = Byte.compare(a[i], b[i])) != 0) {
                    return cmp;
                }
            }

            return 0;
        }
    }
}

答案 14 :(得分:-4)

有一种更快的方法:

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