![](/img/trans.png)
[英]In Android, why does ArrayList.contains(obj) always return false?
[英]Why does contains value return false?
请不要介意我的约定错误
class test implements Comparable<test>
{
int id;
String name;
public test(int id,String name)
{
this.id=id;
this.name=name;
}
@Override
public int compareTo(test o) {
if(this.id>o.id)
return 1;
else if(this.id==o.id)
return 0;
else
return -1;
}
}
class le
{
public static void main(String[] args) {
TreeMap<test,test> p=new TreeMap<test,test>();
p.put(new test(1,"sad"), new test(3121, "adweq"));
p.put(new test(2, "asds"),new test(3123,"awdq"));
p.put(new test(23,"akjdb"),new test(23123,"dqWQDD"));
Set<Map.Entry<test,test>> s=p.entrySet();
Iterator <Map.Entry<test, test>> i=s.iterator();
while(i.hasNext())
{
Map.Entry<test, test> m=i.next();
System.out.println(m.getKey().id);
System.out.println(m.getValue().name);
}
System.out.println(p.containsKey(new test(1,"sad")));//returning true
System.out.println(p.containsValue(new test(3123,"awdq")));//why it is returning false
}
}
在这里,我做了一个树形图,想知道为什么在containsvalue方法中它返回false? 而我已经实现了可比的界面>
因为您的类test
不会覆盖equals()
和hashCode()
,所以类似
@Override
public boolean equals(Object o) {
if (o instanceof test) {
test t = (test) o;
return t.id == o.id;
}
return false;
}
@Override
public int hashCode() {
return Integer.valueOf(id).hashCode();
}
假设id相等就足够了。 此外, test
是一个不好的类名。 Java的命名约定是Test
但这也是一个不好的名字。 也许是EqualityTest
(所以它有一些含义)。
您需要在Test
类中重写Object.equals
,以检查new test(3123,"awdq")
与另一个new test(3123,"awdq")
实例之间的相等性。
还建议在覆盖equals
时覆盖Object.hashCode
。
compareTo()
方法还不够-您需要实现一个equals()
方法(建议您在覆盖hashCode()
时也覆盖hashCode()
equals()
)。 这是如何做:
class test implements Comparable<test>
{
int id;
String name;
public test(int id,String name)
{
this.id=id;
this.name=name;
}
@Override
public int compareTo(test o) {
if(this.id>o.id)
return 1;
else if(this.id==o.id)
return 0;
else
return -1;
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if(!this.getClass().equals(o.getClass())
return false;
test that = (test) o;
return this.compareTo(that) == 0;
}
@Override
public int hashCode() { return id; }
}
旁注为什么equals()使用getClass().equals(o.getClass())
而不是(o instanceof test)
?
我们假设有一个名为test2的测试类的子类,并且t1和t2分别是类型test2的对象。
如果test2覆盖equals(),则如果test中的equals()
是使用instanceof
实现的,则t1.equals(t2)
会产生与t2.equals(t1)
不同的结果。 这违反了equals()
合同(特别是对称要求)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.