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