我有一个ArrayList
对象的Test
,它使用字符串作为等效性检查。我希望能够使用List.contains()
来检查列表中是否包含使用特定字符串的对象。
只是:
Test a = new Test("a");
a.equals("a"); // True
List<Test> test = new ArrayList<Test>();
test.add(a);
test.contains("a"); // False!
等于和哈希函数:
@Override
public boolean equals(Object o) {
if (o == null) return false;
if (o == this) return true;
if (!(o instanceof Test)) {
return (o instanceof String) && (name.equals(o));
}
Test t = (Test)o;
return name.equals(t.GetName());
}
@Override
public int hashCode() {
return name.hashCode();
}
我读到要确保contains
适用于自定义类,需要重写equals
。因此,对我来说,奇怪的是,虽然equals
返回true,但是contains
返回false。
我该如何工作?
Full code
参考方案
仅仅因为您的Test
的equals
在将字符串传递给它时可能返回true,并不意味着当您向其传递String
实例时equals
的Test
将永远返回true。实际上,当传递给它的实例是另一个String
时,equals
的true
只能返回String
:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) { // the passed instance must be a String
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
ArrayList
的contains
调用indexOf
,它使用搜索到的实例的equals
方法(在您的示例中为String
“a”),而不是List
的元素类型(在您的情况下为Test
):
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i])) // o in your case is a String while
// elementData[i] is a Test
// so String's equals returns false
return i;
}
return -1;
}
Java:如果我覆盖.equals方法,是否仍可以使用==测试引用相等性? - java我有以下情况:我需要根据高度对树进行排序,因此我使用height属性使Tree成为可比较树。但是,我还被告知要覆盖equals和hashCode方法,以避免不可预测的行为。尽管如此,有时我还是想使用==比较根目录或类似内容的参考。这是否仍然可能或==比较调用equals方法? 参考方案 equals()用于将对象与程序员设置的规则进行比较。在您的示例中,您按…
为什么Entry接口定义了equals和hashCode之类的方法? - java我看到接口java.util.Map.Entry具有方法:boolean equals(Object o); int hashCode(); 当从Entry类继承相同的方法时,为什么上述方法是Object接口的一部分?感谢致敬,拉胡尔 参考方案 有三点要考虑:从技术角度来看,这不是必需的:每个类都从Object类继承这两个方法。从技术上讲,将这两种方法添加到…
Java不平等是可传递的吗? - java如果我有3个对象a,b和c,并且想要检查它们是否彼此相等,则需要检查:if (!a.equals(b) && !b.equals(c) && !a.equals(c)) { // to simplify, assume non-null // do something } 根据Java文档,对于正确实现的equals方法: 它…
List.contains()没有返回正确的结果,但是手动搜索确实 - java我的代码发生了一个奇怪的问题: RestAPIHeader requestedBy = new RestAPIHeader("X-Requested-By", "test"); // Act RestAPIRequest req = prepareLoginRequest(USER_NAME, PASSWORD); /…
使用hashCode实现等于否吗? - java我一直在尝试以下equals和hashCode的实现:@Override public boolean equals(Object obj) { return obj != null && hashCode() == obj.hashCode(); } @Override public int hashCode() { return new …