Collection
的超级父接口为Iterable<E>
可迭代的,需要实现返回迭代器,那么for(:)
语句就能使用了。
Collection
提供的方法如下:
说明:
retainAll 方法容易被忽略,我就是其中一个。这个方法告诉我们取交集。
removeAll 可以得到差集
addAll 可以得到并集
那么集合里面的交差并都有了。
直接下级实现类有AbstractCollection
,那么看下他的具体实现,取其中一个:
其中具体实现都是使用Iterator<E> it
来实现的
再看一个:
这里的迭代器删除,如果改成如下会怎么样
public boolean removeAll(Collection<?> c) {
Objects.requireNonNull(c);
boolean modified = false;
Iterator<?> it = iterator();
// jdk方法
while (it.hasNext()) {
if (c.contains(it.next())) {
it.remove();
modified = true;
}
}
// 方法2
for (Object o : c) {
if (this.contains(o)) {
this.remove(o);
}
}
// 方法3
for (Object o : c) {
this.remove(o);
}
return modified;
}
说明:
方法2多此一举。jdk方法iterator用的多。
方法3和jdk方法哪个好呢?