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