Какой самый быстрый и эффективный способ проверить 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.

Другие вопросы по тегам