addAll()是否返回false?

时间:2014-10-01 09:04:24

标签: 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;
}

据我所知,|=bitwise or运算符,只是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吗?如果不是为什么它有回报?

4 个答案:

答案 0 :(得分:6)

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

的集合

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

答案 1 :(得分:3)

|=bitwise OR

| (如果其操作数中的一个或两个相应位为1,则按位OR)将位设置为1;如果两个相应位均为0,则将位设置为0。换句话说,|在所有情况下都返回1,除非两个操作数的相应位都为零。得到的位模式是&#34; set&#34;两个操作数中任何一个的(1或真)位。此属性用于&#34;设置&#34;或者&#34;打开&#34; a&#34; flag&#34;无论先前是否设置了该标志,您的flags或options变量中的(位设置为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 :(得分:2)

来自addAll()

的文档
  

返回:

     

如果通过调用更改了集合,则为true。

如果集合根本没有被修改,那么就是假。

考虑下面的程序。(按照评论中的结果)

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
        }

答案 3 :(得分:0)

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