AbstractCollection 的 addAll() 方法实现如下:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c) if (add(e)) modified = true;
return modified;
}
所以,如果参数中的c是一个包含3个元素的集合,可能会出现这样的情况,即前两个元素被添加了,但第三个元素由于某些原因未被添加(我现在想不出来)。在这种情况下,addAll()操作-将所有这3个元素添加到基础集合中-未被执行,并且addAll()返回false,就像应该的那样。然而,前两个元素仍然存在,开发者可能期望它们不应该存在(?) HashSet在其使用类型为Collection的单参数构造函数中使用此addAll().
因此,开发者可能会得到一个HashSet实例,其中包含他的集合的一部分,而他正在寻找整个集合,而这发生时没有任何警告。
涉及的方法-- HashMap的put()和HashSet的add()--似乎足够简单--在这些操作期间似乎不会出错--但还是有可能出错。我有什么遗漏吗?