Как указано в Arrays.equals(byte[],byte[])
документации :
Два массива считаются равными, если оба массива содержат одинаковое количество элементов, а все соответствующие пары элементов в двух массивах равны. Другими словами, два массива равны, если они содержат одинаковые элементы в одинаковом порядке .
Таким образом, вы не сможете успешно сравнить два ваших байтовых массива, если ожидаете, что они содержат некоторые различия.
Если вы не имеете (или не хотите) контролировать, как сериализуются ваши объекты, то вы, вероятно, можете использовать какой-то Comparator<byte[]>
.
public final class MyComparator implements Comparator<byte[]> {
private static final int ATTR_START = 0;
private static final int ATTR_END = 7;
@Override
public int compare(byte[] left, byte[] right) {
if (left.length != right.length)
return left.length - right.length;
byte[] leftAttr = Arrays.copyOfRange(left, ATTR_START, ATTR_END);
byte[] rightAttr = Arrays.copyOfRange(left, ATTR_START, ATTR_END);
return Arrays.equals(leftAttr, rightAttr) ? 0 : -1;
}
}
Я понимаю, что это немного хитроумно, так что вот еще один взгляд на проблему.
public final class MyByteArrayOutputStream extends ByteArrayOutputStream {
private static final int ATTR_START = 0;
private static final int ATTR_END = 7;
@Override
public int hashCode() {
// this can be implemented based on *your* attribute/attributes
// and its/their location in the buffer too, like in equals just below
return Arrays.hashCode(buf);
}
@Override
public boolean equals(Object object) {
boolean equals = false;
if (object instanceof MyByteArrayOutputStream) {
MyByteArrayOutputStream other = (MyByteArrayOutputStream) object;
byte[] thisAttr = Arrays.copyOfRange(buf, ATTR_START, ATTR_END);
byte[] otherAttr = Arrays.copyOfRange(other.buf, ATTR_START, ATTR_END);
if (Arrays.equals(thisAttr, otherAttr)) {
byte[] thisRest = Arrays.copyOfRange(buf, ATTR_END, buf.length);
byte[] otherRest = Arrays.copyOfRange(other.buf, ATTR_END, buf.length);
equals = Arrays.equals(thisRest, otherRest);
}
}
return equals;
}
}
Подкласс ByteArrayOutputStream
и реализуйте свою собственную логику равных.