检查两个 java 对象的 Deep Equal 的最快和最有效的方法是什么?
What is the fastest and efficient way to check Deep Equal for two java objects?
我有两个 java 对象,其 byte[]
字段的 大小为数百万 。检查这些 java 对象的 Deep Equal 的最快和最有效的方法是什么?
示例实体:
@Entity
public class NormalBook
{
@Id
private String bookId;
@Column
private String title;
@Column
private byte[] pdfFile;
//setters and getters
}
Note: I am doing it for an ORM tool basically I am checking an object
(which is in managed state) with an object present in Persistence
Context.
覆盖 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
在对象 class 的 equals()
定义中使用以下内容:
java.util.Arrays.equals(bs1, bs2)
您可能还想先检查它们是否相同数组(实例)。尽管这种方法无论如何都可以做到这一点。
例如(并对包含数组的 class 做出一些假设):
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);
}
如果您的 class 中还有其他字段,您的 equals()
也应该考虑这些字段。
(如果您能提供更多关于数组中存储的数据类型的信息,可能会有更好的答案。)
如果你的 class 有像 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。
我有两个 java 对象,其 byte[]
字段的 大小为数百万 。检查这些 java 对象的 Deep Equal 的最快和最有效的方法是什么?
示例实体:
@Entity
public class NormalBook
{
@Id
private String bookId;
@Column
private String title;
@Column
private byte[] pdfFile;
//setters and getters
}
Note: I am doing it for an ORM tool basically I am checking an object (which is in managed state) with an object present in Persistence Context.
覆盖 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
在对象 class 的 equals()
定义中使用以下内容:
java.util.Arrays.equals(bs1, bs2)
您可能还想先检查它们是否相同数组(实例)。尽管这种方法无论如何都可以做到这一点。
例如(并对包含数组的 class 做出一些假设):
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);
}
如果您的 class 中还有其他字段,您的 equals()
也应该考虑这些字段。
(如果您能提供更多关于数组中存储的数据类型的信息,可能会有更好的答案。)
如果你的 class 有像 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。