как сравнить массив 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 говорит мне, что я ошибаюсь, почему??

506   15  

15 ответов:

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

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

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

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

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

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

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

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

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

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

если вы пытаетесь использовать массив в качестве универсального ключа HashMap, это не сработает. Рассмотрите возможность создания пользовательского объекта-оболочки, который содержит массив и чей equals(...) и hashcode(...) метод возвращает результаты из java.утиль.Методы массивов. Например...

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(...) методы.

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

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

например

import java.util.Arrays;

'''''

Arrays.equals(a,b);

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

попробуйте этот:

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

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

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

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

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

.

Java byte compare,

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

потому что ни ==, ни equals() метод массива сравнить содержимое; оба только оценить идентичность объекта (== всегда так делает, и equals() не перезаписывается, поэтому версия с Object используется).

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

вы также можете использовать org.апаш.палата общин.ленг.ArrayUtils.isEquals ()

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

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

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

Comments

    Ничего не найдено.