该代码
Collection使用
add()返回的方法添加a的所有成员
boolean,指示是否
add()成功。如果任何添加成功且所有添加失败,则该
addAll方法执行的 *** 作将返回。(这对我来说确实很奇怪,因为我只会在所有添加成功的情况下返回,但是我离题了。)
true``false``true
因此,您可以这样做:
@Overridepublic boolean addAll(Collection<? extends E> c) { boolean result = false; for (E e : c) { if (add(e)) {result = true; } } return result;}
但这有点冗长,因为您可以
result直接对变量进行 *** 作:
@Overridepublic boolean addAll(Collection<? extends E> c) { boolean result = false; for (E e : c) { result = add(e) || result; } return result;}
因此,我们在逻辑上将旧值
result与返回值进行或运算,
add以获取新值。(请注意-
我们希望
result位于的右侧
||;这是因为
||“短路”并且不会费心检查an的右侧,
||如果左侧为
true)。因此,如果
add(e)和
result存在另一种方法,它将不会评估右侧-
即不运行该
add()方法-曾经
result是
true。)
编写该方法的人决定他们要尽可能简洁,因此他们进行了更改:
result = add(e) || result;
至:
result |= add(e);
与以下内容相同:
result = result | add(e);
所述
|*** 作者是按位或其中的效果基本上是一样的,其是不一样的逻辑OR,除了布尔值,唯一的区别是在
|不具有短路行为如上所述。
||=Java中没有语法,这就是为什么使用按位OR的原因,尽管即使这样做也可能会遇到上述相同的短路问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)