Java | =运算符问题

use*_*915 7 java operators

我需要这个奇怪的操作员的帮助|=.你能解释一下这段代码的作用吗?

@Override
public boolean addAll(Collection<? extends E> c) {
    boolean result = false;
    for (E e : c) {
        result |= add(e);
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

Fem*_*ref 6

这是一个简写:

result = result | add(e);
Run Code Online (Sandbox Code Playgroud)

其中|是按位OR运算符.

  • 实际上,它是逻辑OR,因为它应用于`boolean`类型.并不是说净效果有任何不同. (3认同)

Dav*_*ebb 3

Collection该代码使用add()返回 a 的方法添加 a 的所有成员boolean,指示是否add()成功。该addAll方法的作用是true,如果任何添加成功或者false全部添加失败,则返回。true(这对我来说确实很奇怪,因为只有当所有添加都成功时我才会返回,但我离题了。)

\n

所以你可以这样做:

\n
@Override\npublic boolean addAll(Collection<? extends E> c) {\n    boolean result = false;\n    for (E e : c) {\n        if (add(e)) {\n           result = true;\n        }\n    }\n    return result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但这有点冗长,因为您可以result更直接地对变量进行操作:

\n
@Override\npublic boolean addAll(Collection<? extends E> c) {\n    boolean result = false;\n    for (E e : c) {\n        result = add(e) || result;\n    }\n    return result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

因此,我们将 的旧值result与 的返回值进行逻辑“或”运算add以获得新值。(注意:我们希望result位于 的右侧||;这是因为“短路”,并且如果左侧是 ,则||不会费心检查 an 的右侧)。因此,如果和是相反的情况,它不会评估右侧 \xe2\x80\x94 ,即不运行方法\xe2\x80\x94 一次。)||trueadd(e)resultadd()resulttrue

\n

编写该方法的人决定尽可能简洁,因此他们进行了更改:

\n
result = add(e) || result;\n
Run Code Online (Sandbox Code Playgroud)\n

到:

\n
result |= add(e);\n
Run Code Online (Sandbox Code Playgroud)\n

与以下内容相同:

\n
result = result | add(e);\n
Run Code Online (Sandbox Code Playgroud)\n

|运算符是按位“或”,与逻辑“或”不同,但布尔值除外,其效果基本相同,唯一的区别是不|具有上述短路行为。

\n

Java 中没有||=语法,这就是使用按位 OR 的原因,尽管即使这样做,它也可能会出现与上面提到的相同的短路问题。

\n