6

我有两个 java 对象,其byte[]字段大小为数百万。检查这些 java 对象的Deep Equal的最快和有效方法是什么?

样本实体:

@Entity
public class NormalBook
{

  @Id
  private String bookId;

  @Column
  private String title;

  @Column
  private byte[] pdfFile;

  //setters and getters

  }

注意:我是为 ORM 工具做的,基本上我正在检查一个对象(处于托管状态)与持久性上下文中存在的对象。

4

3 回答 3

2

覆盖equals()或使用 *helper 方法(不好的选择!)并分 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 
于 2015-04-17T09:45:42.140 回答
0

如果您的班级有像您这样的字段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。

于 2015-04-17T09:57:23.893 回答
0

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()也应该考虑到这些领域。

(如果您可以提供有关数组中存储的数据类型的更多信息,那么这个问题可能会有更好的答案。)

于 2015-04-17T09:48:31.073 回答