查看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吗?如果不是为什么它有回报?
答案 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。