这几天做项目的时候发现使用removeAll的时候出现的一个问题做一下探究
例如:list<自定义的类> a=new ArrayList<自定义的类>(); list<自定义的类> b=new ArrayList<E=自定义的类>(); 集合b是集合a 的子集,并且集合b的size()小于集合a的size();
理论上 a.removeAll(b) 之后 a的size()应该大于0,但是结果却是0,结果真是让我大失所望啊。究竟是为什么呢?我去看了一下Java的源代码
remove的源代码
public boolean remove(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext()) {
if (it.next()==null) {
it.remove();
return true;
}
}
} else {
while (it.hasNext()) {
if (o.equals(it.next())) {
it.remove();
return true;
}
}
}
return false;
}</span>
再看removeall的源代码
public boolean removeAll(Collection<?> c) {
boolean modified = false;
Iterator<?> it = iterator();
while (it.hasNext()) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
return modified;
}</span>
我们发现removeall使用的还是remove,而remove使用了,equals,而恰巧的是我自定义的类中重写了equals。。。。找到原因了 既然知道了这个原因,我们在探究一下究竟还有哪些方法也受equals 方法的影响呢?
contains方法有木有?
public boolean contains(Object o) {
Iterator<E> it = iterator();
if (o==null) {
while (it.hasNext())
if (it.next()==null)
return true;
} else {
while (it.hasNext())
if (o.equals(it.next()))
return true;
}
return false;
}</span>
其实说道equals方法就会想到 hashcode,就会想到“==” ,有兴趣的童鞋可以看看我的其他的博文 有详细的介绍哦