Java addAll()是否返回false?

Java addAll()是否返回false?,java,collections,Java,Collections,在查看CollectionUtils addAll方法的源代码时。我注意到它使用了|=符号 public static <T> boolean addAll(Collection<? super T> c, T... elements) { boolean result = false; for (T element : elements) result |= c.add(element); return result; } 这意味着,如果成功添加任何项

在查看CollectionUtils addAll方法的源代码时。我注意到它使用了
|=
符号

public static <T> boolean addAll(Collection<? super T> c, T... elements) {
 boolean result = false;
 for (T element : elements)
    result |= c.add(element);

 return result;
}
这意味着,如果成功添加任何项,它将返回true。
现在我一直在想是否会有一个实例,它会返回false?如果没有返回的原因?

如果要添加的所有元素都已经在集合中(在调用addAll之前),并且集合不允许重复,那么它将返回false,因为所有单个的
add
方法调用都将返回false。这适用于集合,例如
Set

对于其他集合,
add
始终返回true,因此
addAll
将返回true,除非您使用要添加的元素的空列表调用它。

来自

返回:

如果调用导致集合更改,则为true

如果集合根本没有修改,则为false

考虑以下计划。(在评论中遵循结果)

publicstaticvoidmain(字符串[]args){
列表l1=新的ArrayList();
l1.添加(“测试”);
列表l2=新的ArrayList();
System.out.println(l2.addAll(l1));//true
System.out.println(l2.addAll(l1));//true
Set s1=新的HashSet();
s1.添加(“测试”);
Set s2=新的HashSet();
System.out.println(s2.addAll(s1));//true
System.out.println(s2.addAll(s1));//false
}
|=

|(按位或)如果操作数中的一个或两个对应位均为1,则将位设置为1;如果两个对应位均为0,则将位设置为0。换句话说,|在所有情况下都返回1,除非两个操作数的对应位均为零。结果位模式是两个操作数中任意一个操作数的“set”(1或true)位。此属性用于在flags或options变量中“设置”或“打开”一个“标志”(位设置为1),无论该标志以前是否设置过。如果定义了组合掩码,则可以设置多个标志位

// To set or turn on a flag bit(s)
flags = flags | MASK;
// or, more succintly
flags |= MASK;
因此,您的代码相当于:

boolean result = false;
for (T element : elements){
   result = result | c.add(element);
}
return result;

最初的结果将是false,成功添加到集合中的元素之一将设置为true,即
c.add(元素)因此,如果添加了一个元素,它将返回true。

操作:指定集合中的所有元素都附加到此列表的末尾。 如果集合因调用而更改,则返回true。
如果集合未因调用而更改,则返回false。

对于任意
set
@MarkoTopolnik yes,请尝试
set.addAll(set)
。我也这么做了,结果是:)谢谢。我忘带布景了。所以,如果我使用List,它将始终返回true,因为它可以包含重复的值。好吧,除了一个空列表。既然它在循环中第一次迭代后返回,那么它如何添加多个元素呢?谢谢。所以列表总是返回true?因为它允许重复。@user23123412是(假设您传递了要添加的元素的非空数组),因为
add
for List总是返回true。
// To set or turn on a flag bit(s)
flags = flags | MASK;
// or, more succintly
flags |= MASK;
boolean result = false;
for (T element : elements){
   result = result | c.add(element);
}
return result;