有关这部分Java代码的问题,为什么要按原样编写

时间:2019-03-13 16:41:28

标签: java set bitwise-or

我遇到了此源代码,并想确保我理解为什么按原样编写(或应该如此):

boolean modified = false;
Set<String> possibleSites = settings.getPossibleSites();
Set<String> visibleSites = settings.getVisibleSites();
modified = someMysteriousMethod();

// Remove sites from visibleSites that are not in possibleSites
modified |= visibleSites.retainAll(possibleSites);

我对LAST语句的疑问:

  1. 为什么使用按位运算符? keepAll()将返回一个布尔值,表示发生了什么情况?

  2. 操作员/语句在说什么?如果修改等于返回值,则仅保留修改值,还是如果返回值不同,则将修改后的值设置为该新值?

5 个答案:

答案 0 :(得分:1)

这意味着如果modifiedretainAll()为真,则modified应该为真。 (给定名称的含义是合理的。retainAll仅在更改{{1}时返回true,而Set可能返回true或false取决于someMysteriousMethod的状态是否更改)

代码分解为:

Set

请看以下代码,以查看布尔值上modified = modified | visibleSites.retainAll(possibleSites); 的结果:

|

输出:

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

(只有true true true false 会返回false|false,因此在代码中,falsemodified都必须返回false,retainAll才能成为{{ 1}})

答案 1 :(得分:1)

boolean retainAll(Collection<?> c)

如果true则返回the set changed as a result of the call

modified |= visibleSites.retainAll(possibleSites);

因此,上述声明意味着,如果modified true retainAll返回 true ,则modified设置为< strong> true ,否则modified的值为 false

答案 2 :(得分:0)

返回值retainAll method in Set表示呼叫是否更改了该集合。

  

返回:

     

true(如果此设置因通话而更改)

在这里true表示该集合已被修改。 |=复合运算符在参数上执行“或”并将其分配回左侧。对于您的情况,这意味着如果retainAll返回true,则将true分配回modified,否则将modified保持不变。

答案 3 :(得分:0)

根据javadoc

  

retainAll重新调整true,如果此设置因通话而改变

a |= b是一种会影响“ a or b”到“ a”结果的操作。 因此,根据您的情况,想法是使语句“ modifiedvisibleSitesOR修改visibleSites retainAll之前被修改的结果”

答案 4 :(得分:0)

之后:

  

modified = someMysteriousMethod();

然后modified可能为true,也可能不是。的效果

  

修改| = visibleSites.retainAll(possibleSites);

是将modified设置为true(如果已经为true),如果其他条件成立则将其从false更改为true(我故意说 effect ,我并不是在描述实际指令操作)。

第二条语句可以写为

if (visibleSites.retainAll(possibleSites)) {
      modified = true;
}

具有相同的结果。在某种程度上这是一个品味问题。我发现原始文档(使用|=运算符)更易于阅读,因为它是一个简单的直线逻辑表达式,而不是控制流语句

顺便说一句,它不被称为“按位”运算符。 Java有两个'|'和两个相应的“ | =”运算符;在整数之间为bitwise-or,在布尔值之间为logical-or