我遇到了使ArrayList正确使用重写equals的问题。问题是我试图使用equals来仅测试单个键字段,并使用ArrayList.contains()来测试是否存在具有正确字段的对象。下面是一个例子ArrayList未使用重写的等于
public class TestClass {
private static class InnerClass{
private final String testKey;
//data and such
InnerClass(String testKey, int dataStuff) {
this.testKey =testKey;
//etc
}
@Override
public boolean equals (Object in) {
System.out.println("reached here");
if(in == null) {
return false;
}else if(in instanceof String) {
String inString = (String) in;
return testKey == null ? false : testKey.equals(inString);
}else {
return false;
}
}
}
public static void main(String[] args) {
ArrayList<InnerClass> objectList = new ArrayList<InnerClass>();
//add some entries
objectList.add(new InnerClass("UNIQUE ID1", 42));
System.out.println(objectList.contains("UNIQUE ID1"));
}
}
我担心的是,我不仅在输出越来越假,但我还没有得到“到达这里”输出。
有没有人有任何想法,为什么这个覆盖被完全忽略?对于我不知道的重写和内部类有一些微妙之处吗?
编辑: 有问题的网站,所以我似乎无法标记答案。 感谢您的快速回应:是我的一个疏忽,它是String .equals thta被称为,而不是我自定义的一个。我猜这是现在的老式检查
谢谢。关于新的InnerClass()的建议也很有帮助。 :) – Sufian
在我看来indexOf的实施应该是相反的方式:elementData [i] .equals(o)... – marcolopes