addAll()实现——Java
AbstractCollection的addAll()实现如下: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(…)只说
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中的使用没有完全涵盖这一点。