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 个元素的集合,则可能是添加了前 2 个元素,但由于某种我现在想不出的原因未添加第 3 个元素。
在这种情况下,addAll()操作——将所有这 3 个元素添加到底层 Collection 中并没有执行addAll()应该返回 false。但是,前 2 个元素是存在的——开发人员会期望它们不应该是(?)
HashSet在其 Collection 类型的带有单参数的构造函数中使用了这个addAll() 。
因此,开发人员在寻找整个集合时,最终可能会得到一个包含他集合的一部分的HashSet实例。这发生在没有任何警告的情况下。
所涉及的方法 ——HashMap的put()和HashSet的add()看起来很简单——在这些操作期间似乎没有任何问题——但仍然如此。
我在这里错过了什么吗?