我有以下两个类,并想Foo1用作中的键HashMap。Foo1如果两个对象相等,则两个对象相等;如果字节数组满足Foo2,则两个对象相等。Foo2Arrays.equals()
我不太清楚什么为做hashCode()的方法Foo1。我是否只需要总结每个Foo2对象的哈希码,还是效率低下?
public class Foo1 {
Foo2[] foo2_array;
@Override
public boolean equals(Object Other) {
for (int i = 0; i < foo2_array.length; i++) {
if (!foo2_array[i].equals(other.foo2_array[i])
return false;
}
return true;
}
@Override
public int hashCode() {
// what to here?
}
}
public class Foo2 {
byte[] values;
@Override
public boolean equals(Object other) {
return Arrays.equals(values, other.values);
}
@Override
public int hashCode() {
return Arrays.hashCode(values);
}
}
Run Code Online (Sandbox Code Playgroud)
您hashcode应该使用与equals不破坏合同相同的属性集。
只需使用Arrays.hashcode完成Foo2
另外,您不必遍历等式中的每个元素就可以使用 Arrays.equals
Foo2 equals看起来类似于Foo1.equals
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Foo1 other = (Foo1) obj;
if (!Arrays.equals(foo2_array, other.foo2_array))
return false;
return true;
}
Run Code Online (Sandbox Code Playgroud)
和哈希码类似于Foo1哈希码
@Override
public int hashCode() {
return Arrays.hashCode(foo2_array);
}
Run Code Online (Sandbox Code Playgroud)
同样,在实现equals时,请检查是否存在相同的引用和对象有效性。
| 归档时间: |
|
| 查看次数: |
4609 次 |
| 最近记录: |