gpt4 book ai didi

java - List.contains() 失败,而 .equals() 工作

转载 作者:IT老高 更新时间:2023-10-28 20:59:23 25 4
gpt4 key购买 nike

我有一个 ArrayListTest 对象,它使用字符串作为等效检查。我希望能够使用 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

最佳答案

仅仅因为你的Testequals当您将字符串传递给它时可能返回 true 并不意味着 Stringequals当您通过 Test 时将永远返回 true以它为例。事实上,Stringequals只能返回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;
}

ArrayListcontains来电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 - List.contains() 失败,而 .equals() 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35425609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com