как сравнить массив Java Byte []?

93
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», я получаю ответ «ложь ложь ложь ложь».

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

Ленивый
источник
возможный дубликат сравнения двух байтовых массивов? (Ява)
Вадим
Arrays.equals работает. Запустите и проверьте онлайн здесь onecompiler.com/java/3wc4ec2su
karthikdivi

Ответы:

193

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

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

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

Лукаш
источник
если у меня есть 'HashMap <byte [], IoBuffer>' и я 'put (a, buffer)' ,,, если я 'print (map.containsKey (b))', он печатает «false», это то же самое причина ????
Ленивый
3
@Lazy: Да, причина та же ... вы не можете использовать raw byte [] в качестве ключей на картах ... Подробнее здесь: stackoverflow.com/questions/1058149/…
Лукаш
6

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

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

проверка души
источник
Это часть ерунды Java: зачем использовать статический метод из другого класса для сравнения объектов в другом классе? То есть: почему они не переопределили equals()метод?
U. Windl
3

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

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

BTW: Я бы это не разработал. ;)

Питер Лоури
источник
1

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

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

Дэн Винтон
источник
если у меня есть 'HashMap <byte [], IoBuffer>' и я 'put (a, buffer)' ,,, если я 'print (map.containsKey (b))', он печатает «false», это то же самое причина ????
Ленивый
@Lazy - см stackoverflow.com/questions/1058149/...
Dan Винтон
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

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

Андрейс
источник
0

Попробуйте для этого:

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

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

Бхавеш Шах
источник
0

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

Джек47
источник
0

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

После некоторых исследований я понял, что ByteBuffer из JDK имеет эту функцию и не копирует исходный массив, что хорошо. Более того, вы можете быстрее сравнивать с 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).

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

Майкл Боргвардт
источник
0

Вы также можете использовать org.apache.commons.lang.ArrayUtils.isEquals ()

RoutesMaps.com
источник
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;
        }
    }
}
Венер
источник
-4

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

Arrays.hashCode(arr1) == Arrays.hashCode(arr2)
Нагятка
источник
2
Под «быстрее» вы подразумеваете «медленнее».
divegeek