如何比较Java Byte []数组?


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


Answers:


191

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

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

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


如果我有一个'HashMap <byte [],IoBuffer>'并且我'put(a,buffer)',,如果我'print(map.containsKey(b))'它打印为“ false”,是否相同原因????
懒惰2012年

3
@Lazy:是的,道理是一样的......你不能在地图中使用原始字节[]作为键...在这里阅读更多:stackoverflow.com/questions/1058149/...
卢卡斯

6

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

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


那是Java废话的一部分:为什么要使用来自其他类的静态方法来比较另一个类中的对象?那就是:他们为什么不重写该equals()方法?
U. Windl '18 -4-18

3

由于byte []是可变的,因此仅.equals()当它是同一对象时才被视为存在。

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

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



1

如果您试图将数组用作通用的HashMap键,那将无法正常工作。考虑创建一个保存该数组的自定义包装对象,该对象的equals(...)and 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(...)方法。


0

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

如果要测试值相等性,则应使用java.util.Arrays中的便捷比较函数

例如

import java.util.Arrays;

'''''

Arrays.equals(a,b);

0

你也可以使用一个ByteArrayComparatorApache目录。除了等于之外,它还允许您比较一个数组是否大于另一个数组。


0

为此尝试:

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

我也不确定,但是尝试一下可能会起作用。


0

为什么a []不等于b []?由于equals功能真的叫上Byte[]或者byte[]Object.equals(Object obj)。此函数仅比较对象标识,不比较数组的内容。


0

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

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


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

0

因为数组==equals()方法和内容都不比较;两者都只评估对象的身份(==总是这样做,并且equals()不会被覆盖,因此Object正在使用from的版本)。

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



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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.