Как сравнить массив 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));
    }
}

Я не знаю, почему все они печатают false.

Когда я запускаю "java ByteArray", ответ "false false false false".

Я думаю, что a [] равно b [], но JVM говорит мне, что я ошибаюсь, почему?

Ответ 1

Используйте Arrays.equals(), если вы хотите сравнить фактическое содержимое массивов, содержащих значения примитивных типов (например, байт).

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

Используйте Arrays.deepEquals для сравнения массивов, содержащих объекты.

Ответ 2

Потому что они не равны, т.е. это разные массивы с одинаковыми элементами внутри.

Попробуйте использовать Arrays.equals() или Arrays.deepEquals().

Ответ 3

Поскольку byte [] является изменяемым, он рассматривается как только .equals(), если его один и тот же объект.

Если вы хотите сравнить содержимое, которое вы должны использовать Arrays.equals(a, b)

Кстати: Это не так, как я бы его проектировал.;)

Ответ 4

Вы посмотрели Arrays.equals()?

Изменить: если в соответствии с вашим комментарием проблема заключается в использовании байтового массива в качестве ключа HashMap, то см. этот вопрос.

Ответ 5

Если вы пытаетесь использовать массив как общий ключ 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(...) для чистого использования.

Ответ 6

Потому что ни метод ==, ни метод equals() массива не сравнивают содержимое; оба только оценивают идентичность объекта.

Для сравнения содержимого используйте Arrays.equals().

Ответ 7

Они возвращают false, потому что вы проверяете идентификацию объекта, а не равнозначно равенству. Это возвращает false, потому что ваши массивы на самом деле являются разными объектами в памяти.

Если вы хотите проверить значение равенства, следует использовать удобные функции сравнения в java.util.Arrays

например.

import java.util.Arrays;

'''''

Arrays.equals(a,b);

Ответ 8

Попробуйте следующее:

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

Я тоже не уверен в этом, но попробуйте, возможно, это работает.

Ответ 9

Вы также можете использовать ByteArrayComparator из Apache Directory. В дополнение к равным, он позволяет сравнивать, если один массив больше, чем другой.

Ответ 10

почему a [] не равно b []? Поскольку функция equals действительно вызвана Byte[] или Byte[] равна Object.equals(Object obj). Эти функции сравнивают только идентификацию объекта, не сравнивают содержимое массива.

Ответ 11

Я искал массивную оболочку, которая делает его сопоставимым с использованием guava TreeRangeMap. Класс не принимает компаратор.

После некоторого исследования я понял, что ByteBuffer от JDK имеет эту функцию и не копирует оригинальный массив, который хорош. Более того, вы можете быстрее сравнивать с ByteBuffer:: asLongBuffer 8 байт (также не копирует). По умолчанию ByteBuffer:: wrap (byte []) использует BigEndian, поэтому отношение отношения такое же, как и сравнение отдельных байтов.

.

Ответ 12

Там более быстрый способ сделать это:

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