addAll()实现 - Java

Roa*_*oam 3 java collections

的addAll()类AbstractCollection是这样实现的:

public boolean addAll(Collection<? extends E> c) { 
    boolean modified = false;
    for (E e : c) if (add(e)) modified = true; 
    return modified;
}
Run Code Online (Sandbox Code Playgroud)

因此,如果参数中的c是3个元素的集合,则可能是这些元素中的前2个被添加的情况,但是由于某种原因我不能想到第3个元素.

在这种情况下,addAll()操作 - 不会将所有这3个元素添加到基础Collection中,并且addAll()将返回false.但是,前两个元素是存在的 - 开发人员会期望它们不应该是(?)

HashSet在其构造函数中使用此addAll(),其中包含Collection类型的单个参数.

因此,在他寻找整个集合时,开发人员最终可能会得到一个包含其集合的一部分的HashSet实例.这没有任何警告就会发生.

该方法involved-- 把()HashMap中,并加入()HashSet的似乎简单enough--似乎`吨任何事情都有可能这些operations--但仍时出错.

我错过了什么吗?

Jim*_*son 6

合同Collection#addAll(...)只是说true如果修改了集合(this)就会返回.它不保证添加是原子的或完整的.


ars*_*jii 5

在这个[并非所有被添加的元素]的情况下,addAll()操作 - 所有这3个元素都添加到底层Collection中,并且addAll()返回false应该是这样.

addAll()返回true如果任何的元素c已经成功添加,,如果他们全部加入.您可以从您发布的代码中看到这一点:modified被设置成true 只要add()调用返回true.