addAll()实现——Java

addAll()实现——Java,java,collections,Java,Collections,AbstractCollection的addAll()实现如下: public boolean addAll(Collection<? extends E> c) { boolean modified = false; for (E e : c) if (add(e)) modified = true; return modified; } public boolean addAll(CollectionCollection的契约#addAll(…)只说

AbstractCollectionaddAll()实现如下:

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

public boolean addAll(CollectionCollection的契约#addAll(…)
只说如果集合(this)为已修改。它不保证添加是原子的或完整的。

表示如果当前
集合
被修改(
否则为false),则
addAll
返回
true

这意味着,即使只添加了一个元素,该方法也将返回
true
。请将返回的值视为是否由于方法调用而修改了此集合,而不是添加了所有元素的指示符

在这种[not all elements being added]情况下,addAll()操作——将所有这3个元素添加到基础集合中的操作不会被执行,并且addAll()会返回false

如果成功添加了
c
的任何元素,而不是全部添加,则返回
true
。您可以从发布的代码中看到这一点:
modified
在调用返回
true
时设置为
true

因此,开发人员在查找整个集合时,可能会得到一个包含其集合一部分的
HashSet
实例。这种情况发生时没有任何警告

不正确。
Set.add
返回
false
这一事实意味着它已经存在。唯一的例外是有大小限制的有界集合,此时开发人员应该知道它是有界集合,并且不一定包含所有元素。对于集合中的大多数集合API,调用
addAll
保证
containsAll
将返回
true
,如果您使用相同的集合调用它。也就是说,这将打印
true

Set<T> set1 = new HashSet<>();
Set<T> set2 = new HashSet<>();
// Add stuff to the sets
set1.addAll(set2);
System.out.println(set1.containsAll(set2));
Set set1=new HashSet();
Set set2=新的HashSet();
//向集合中添加内容
set1.addAll(set2);
System.out.println(set1.containsAll(set2));

正如其他人已经提到的,如果成功添加任何元素,该方法将返回
true

此外:

如果集合由于任何原因拒绝添加某个特定元素,而不是因为它已经包含该元素,则它必须抛出异常(而不是返回false)。这将保留在该调用返回后集合始终包含指定元素的不变量


因此,考虑到您介绍的
addAll
的实现,如果没有添加元素,并且没有引发异常,这是因为元素已经在集合中了。

Nice,不知道这将异常情况限制在您在回答中所说的范围内,我想不出还有什么其他问题我很遗憾它在HashSet中的使用没有完全涵盖这一点。