addAll()方法会返回一个布尔值吗?

8

当我查看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;
}

据我理解,|=是一个按位或运算符,只是result = result|c.add(element)的简写,例如:

System.out.println(false|true); //true
System.out.println(false|false); //false
System.out.println(true|false); //true
System.out.println(true|true); //true

这意味着如果任何项目成功添加,它将返回true。 现在我一直在想,会不会有一个例外情况,它会返回false?如果没有,为什么它有一个返回值?

2
尝试使用set.addAll(set)来处理任意的Set<Whatever> - Marko Topolnik
@MarkoTopolnik 是的。我也这样做了,结果很棒 :) - Suresh Atta
谢谢。我忘记了Set。所以如果我使用List,它将始终返回true,因为它可以包含重复的值。 - Ken de Guzman
除了一个空列表。 - Marko Topolnik
它在循环中第一次迭代后返回,那么它是如何添加多个元素的? - Viktor Mellgren
@ViktorMellgren 我修复了代码。 - johnlinp
4个回答

8
如果在调用addAll之前,要添加的所有元素已经在集合中(并且该集合不允许重复项),则addAll将返回false,因为所有单独的add方法调用都将返回false。这对于诸如Set的集合来说是正确的。
对于其他集合,add总是返回true,因此除非您使用一个空元素列表调用它,否则addAll将返回true。

谢谢。那么一个List总是会返回true吗?因为它允许重复。 - Ken de Guzman
@user23123412 是的(假设您传递一个非空元素数组给add函数),因为List的add函数总是返回true。 - Eran

3

|=按位或

按位或(Bitwise OR)操作会将两个操作数中相应位上的数字进行或运算,如果其中一个或者两个操作数相应位上都是1,则结果相应位上为1,否则为0。换句话说,除非两个操作数相应位上都是0,否则|操作总是返回1。结果的二进制模式是任意两个操作数中任何一个的“设置”(1或true)位。这个属性可以用来在您的标志或选项变量中“设置”或“打开”一个“标志”(位设置为1),无论该标志之前是否已经设置。如果定义了组合MASK,则可以设置多个标志位。

// 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(element);。所以,如果其中一个元素被添加,它将返回true。


2

来自addAll()文档:

返回值:

如果调用后集合发生改变,则返回true。

如果集合未被修改,则返回false。

考虑下面的程序。(请按照注释中的结果进行操作)

public static void main(String[] args) {
        List<String> l1= new ArrayList<String>();
        l1.add("test");
        List<String> l2= new ArrayList<String>();
        System.out.println(l2.addAll(l1));//true
        System.out.println(l2.addAll(l1));//true
        
        Set<String> s1= new HashSet<String>();
        s1.add("test");
        Set<String> s2= new HashSet<String>();
        System.out.println(s2.addAll(s1));//true
        System.out.println(s2.addAll(s1));//false
        }

0
操作:将指定集合中的所有元素添加到此列表的末尾。 如果调用后集合发生更改,则返回true。 如果调用后集合未更改,则返回false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接