Какой самый быстрый и эффективный способ проверить Deep Equal на наличие двух объектов Java?
У меня есть два объекта Java с byte[]
поле размером порядка миллионов. Какой самый быстрый и эффективный способ проверить Deep Equal для этих объектов Java?
Образец сущности:
@Entity
public class NormalBook
{
@Id
private String bookId;
@Column
private String title;
@Column
private byte[] pdfFile;
//setters and getters
}
Примечание: я делаю это для инструмента ORM, в основном я проверяю объект (который находится в управляемом состоянии) с объектом, присутствующим в контексте постоянства.
3 ответа
Override equals()
или используйте вспомогательный метод * (неверный вариант!) и сделайте это за 5 шагов:
1. Check for *not null*.
2. Check for same *type*.
3. Check for *size of byte[]*.
4. Check for `==` (*reference equality* of byte[])
5. Start comparing byte values
Используйте следующее в определении equals()
в классе вашего объекта:
java.util.Arrays.equals(bs1, bs2)
Вы также можете проверить, являются ли они одним и тем же массивом (экземпляром) в первую очередь. Хотя этот метод вполне может сделать это в любом случае.
Например (и сделать некоторые предположения о вашем классе, который содержит массивы):
public boolean equals(Object obj) {
if(this == obj)
return true;
if(!(obj instanceof MyObject)) // covers case where obj null, too.
return false;
return Arrays.equals(this.bytes, ((MyObject)obj).bytes);
}
Если в вашем классе есть другие поля, ваш equals()
следует принять это во внимание тоже.
(Там может быть лучший ответ на вопрос, если бы вы могли предоставить больше информации о том, какие данные хранятся в массивах.)
Если в вашем классе есть такие поля, как byte[]
Вы можете использовать что-то вроде:
public class MyClass {
byte[] a;
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
MyClass other = (MyClass) obj;
if (!Arrays.equals(a, other.a))
return false;
return true;
}
}
Если вы беспокоитесь о производительности и можете обеспечить уникальнуюhascode
(это важно hascode
нужно быть unique
) тогда вы можете просто сравнить hascode.