的 addAll() AbstractCollection 实现如下:
public boolean addAll(Collection<? extends E> c) {
boolean modified = false;
for (E e : c) if (add(e)) modified = true;
return modified;
}
因此,如果参数中的 c 是一个集合,比如说 3 个元素,则可能是第一个 2
添加了这些元素中的一部分,但由于某种原因我现在无法想到没有添加第三个。
在这种情况下, addAll() 操作——将所有这 3 个元素添加到底层
不携带集合并且 addAll() 返回 false ,因为它应该。然而,前 2 个元素在那里——而开发者
会期望他们不应该(?)
HashSet 在其类型为 Collection 的构造函数中使用了这个 addAll() 。
因此,开发人员最终可能会得到一个 HashSet 实例
当他正在寻找整个 Collection 时,其中包含他 Collection 的一部分。而这会在没有任何警告的情况下发生。
所涉及的方法—— HashMap 的 put() 和 HashSet 的 add() 看起来很简单——
在这些操作中似乎不会出现任何问题——但仍然如此。
我在这里错过了什么吗?
最佳答案
不对。 Set.add
返回 false
的事实意味着它已经存在。唯一的异常(exception)是有大小限制的有界集合,此时开发人员应该知道它无论如何都是有界集合并且不一定包含所有元素。对于集合 API 中的大多数集合,调用 addAll
保证 containsAll
将返回 true
如果您使用相同的集合调用它。 IE。这将打印 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));
关于java - addAll() 实现——Java,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17982604/