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()
если вы хотите сравнить фактическое содержимое массивов, содержащих значения примитивных типов (например, байтов).Используется
Arrays.deepEquals
для сравнения массивов, содержащих объекты.источник
Потому что они не равны, то есть: это разные массивы с одинаковыми элементами внутри.
Попробуйте использовать
Arrays.equals()
илиArrays.deepEquals()
.источник
equals()
метод?Поскольку byte [] является изменяемым, он рассматривается как существующий только в том
.equals()
случае, если это тот же объект.Если вы хотите сравнить содержимое, вам нужно использовать
Arrays.equals(a, b)
BTW: Я бы это не разработал. ;)
источник
ты смотрел
Arrays.equals()
?Изменить: если, согласно вашему комментарию, проблема заключается в использовании байтового массива в качестве ключа HashMap, см. Этот вопрос .
источник
Если вы пытаетесь использовать массив как общий ключ HashMap, это не сработает. Рассмотрите возможность создания настраиваемого объекта-оболочки, который содержит массив и чей метод
equals(...)
andhashcode(...)
возвращает результаты из методов 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(...)
методам.источник
Они возвращают false, потому что вы проверяете идентичность объекта, а не равенство значений. Это возвращает false, потому что ваши массивы на самом деле являются разными объектами в памяти.
Если вы хотите проверить равенство значений, следует использовать удобные функции сравнения в java.util.Arrays
например
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)
. Эта функция только сравнивает идентификацию объекта, но не сравнивает содержимое массива.источник
Я искал оболочку массива, которая делает ее сопоставимой с использованием гуавы TreeRangeMap. Класс не принимает компаратор.
После некоторых исследований я понял, что ByteBuffer из JDK имеет эту функцию и не копирует исходный массив, что хорошо. Более того, вы можете быстрее сравнивать с ByteBuffer :: asLongBuffer 8 байтов за раз (также не копирует). По умолчанию ByteBuffer :: wrap (byte []) использует BigEndian, поэтому отношение порядка такое же, как при сравнении отдельных байтов.
.
источник
Сравнение байтов 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; }
источник
Поскольку ни один
==
изequals()
методов массива не сравнивает содержимое; оба только оценивают идентичность объекта (==
всегда иequals()
не перезаписываются, поэтому используется версия изObject
).Для сравнения содержимого используйте
Arrays.equals()
.источник
Вы также можете использовать org.apache.commons.lang.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; } } }
источник
Есть более быстрый способ сделать это:
источник