# Java 运算符指南

> 原文： [https://howtodoinjava.com/java/basics/operators-in-java/](https://howtodoinjava.com/java/basics/operators-in-java/)

了解可用的 **Java 运算符**，**优先顺序**，并通过示例了解其用法。 我们还将尝试了解何时使用哪个运算符以及期望得到什么。

```java
Table of Contents

1\. What Is an Operator?
2\. Assignment Operator (=)
3\. Arithmetic Operators
    3.1\. Unary Arithmetic Operators
    3.2\. Binary Arithmetic Operators
4\. String Concatenation Operator (+)
5\. Relational Operators
6\. Boolean Logical Operators
7\. Bitwise Operators
8\. Ternary Operator (? :)
9\. Java Operator Precedence Table
```

## 1\. 什么是运算符？

运算符是**符号，它对一个，两个或三个操作数执行特定类型的运算**，并产生结果。 运算符及其操作数的类型确定对操作数执行的运算的类型以及产生的结果的类型。

#### 1.1 Java 运算符的分类

Java 中的运算符可以基于两个条件进行分类：

*   **操作数的数量** – 基于操作数的数量，共有三种类型的运算符。 根据操作数的数量，运算符称为一元，二元或三元运算符。 如果一个运算符采用一个操作数，则它称为**一元运算符**； 如果它使用两个操作数，则它称为**二元运算符**； 如果需要三个操作数，则将其称为**三元运算符**。
*   **他们执行的操作类型** – 运算符称为**算术运算符**，**关系运算符**，**逻辑运算符**或**按位运算符**，具体取决于它对操作数执行的运算类型。

## 2\. 赋值运算符（`=`）

*   赋值运算符（`=`）用于为变量赋值。
*   它是一个二元运算符。 它需要两个操作数。
*   右侧操作数的值已赋值给左侧操作数。
*   左侧操作数必须是变量。

```java
//26 is the right-hand operand. 
//counter is the left-hand operand, which is a variable of type int.

int counter = 26; 

```

Java 确保赋值运算符的右侧操作数的值与左侧操作数的数据类型兼容。 否则，会出现**编译时错误**。 如果是引用变量，则如果右侧操作数表示的对象与作为左侧操作数的参考变量不兼容，则可以编译源代码并获得运行时`ClassCastException`错误。

## 3\. 算术运算符

*   像`+`（加号），` – `（减号），`*`（乘号），`/`（除号）之类的运算符称为算术 Java 中的运算符。
*   它只能与数字类型的操作数一起使用。 这意味着，算术运算符的两个操作数都必须是`byte`，`short`，`char`，`int`，`long`，`float`和`double`类型之一。
*   这些运算符不能具有`boolean`基本类型和引用类型的操作数。

```java
int sum = 10 + 20; 

int difference = 50 - 20; 

long area = 20l * 30l;    

int percentage = 20 / 100;

```

#### 3.1 一元算术运算符

| **运算符** | **说明** |
| --- | --- |
| `'+'` | **一元加运算符**； 没有任何作用 |
| `'-'` | **一元减运算符**； 取反表达式值 |
| `'++'` | **增量运算符**； 将值加 1 |
| `'--'` | **减量运算符**； 将值减 1 |
| `'!'` | **逻辑补运算符**； 反转布尔值 |

#### 3.2 二元算术运算符

| **运算符** | **描述** |
| --- | --- |
| `'+'` | **加法** – 将运算符的两侧的值相加 |
| `'-'` | **减法** - 从左操作数中减去右操作数 |
| `'*'` | **乘法** – 将运算符两侧的值相乘 |
| `'/'` | **除法** – 用左操作数除以右操作数 |
| `'%'` | **模数** - 左操作数除以右操作数，然后返回余数 |

## 4\. 字符串连接运算符（`+`）

Java 中`'+'`运算符已重载。 如果一个运算符用于执行多个功能，则称该运算符为**重载运算符**。

#### 4.1 连接两个字符串

到目前为止，您已经看到它用作算术加法运算符来将两个数字相加。 它也可以用于**连接两个字符串**。

```java
String str1 = "Hello";
String str2 = " World";

String str3 = str1 + str2;      // Assigns "Hello World" to str3

```

#### 3.2 将原始类型连接到字符串

字符串连接运算符还用于将原始类型和引用类型值连接到字符串。

```java
int num = 26;

String str1 = "Alphabets";

String str2 = num + str1;    // Assigns "26Alphabets" to str2

```

#### 4.2 连接`null`

如果引用变量包含`null`引用，则连接运算符将使用字符串`"null"`。

```java
String str1 = "I am ";

String str2 = null;

String str3 = str1 + str2;    // Assigns "I am null" to str3

```

## 5\. 关系运算符

*   所有关系运算符都是二元运算符。
*   他们采用两个操作数。
*   关系运算符产生的结果始终是布尔值`true`或`false`。
*   它们主要用于 Java 控制语句中，例如[`if`语句](https://howtodoinjava.com/java/basics/if-else-statement-in-java/)，[`while`语句](https://howtodoinjava.com/java/basics/while-loop-in-java/)等。

下面让我们看看 Java 中所有可用的关系运算符。

| **运算符** | **描述** |
| --- | --- |
| `'=='` | **等于** – 检查两个操作数的值是否相等，如果是，则条件成立。 |
| `'!='` | **不等于** – 检查两个操作数的值是否相等，如果值不相等，则条件成立。 |
| `'>'` | **大于** – 检查左操作数的值是否大于右操作数的值，如果是，则条件成立。 |
| `'<'` | **小于** – 检查左操作数的值是否小于右操作数的值，如果是，则条件成立。 |
| `'>='` | **大于或等于** – 检查左操作数的值是否大于或等于右操作数的值，如果是，则条件成立。 |
| `'<='` | **小于或等于** – 检查左操作数的值是否小于或等于右操作数的值，如果是，则条件成立。 |

```java
int result = 20; 

if( result > 10) {                  //true
    //some operation
}

boolean isEqual = ( 10 == 20 );     //false

```

## 6\. 布尔逻辑运算符

*   所有布尔逻辑运算符只能与布尔操作数一起使用。
*   它们主要用于控制语句中以比较两个（或多个）条件。

| **运算符** | **描述** |
| --- | --- |
| `'!'` | 如果操作数为`false`，则返回`true`；如果操作数为`true`，则返回`false`。 |
| `'&&'` | 如果两个操作数均为`true`，则返回`true`。 如果任一操作数为`false`，则返回`false`。 |
| `'&'` | 如果两个操作数均为`true`，则返回`true`。 如果任一操作数为`false`，则返回`false`。 |
| <code>'&#124;&#124;'</code> | 如果任一操作数为`true`，则返回`true`。 如果两个操作数均为`false`，则返回`false`。 |
| <code>'&#124;'</code> | 如果任一操作数为`true`，则返回`true`。 如果两个操作数均为`false`，则返回`false`。 |
| `'^'` | 如果其中一个操作数为`true`，则返回`true`，但两个都不为真。 如果两个操作数相同，则返回`false`。 |
| `'&=;'` | 如果两个操作数都为`true`，则`&=`返回`true`。 否则，它返回`false`。 |
| <code>'&#124;='</code> | 如果任一操作数的结果为`true`，则`!=`返回`true`。 否则，它返回`false`。 |
| `'^='` | 如果两个操作数的求值均不同，即其中一个操作数为`true`，但不是两个都为`true`，则`^=`返回`true`。 否则，它返回`false`。 |

```java
int result = 20; 

if( result > 10 && result < 30) {      
    //some operation
}

if( result > 10 || result < 30) {      
    //some operation
}

```

> 1.  **逻辑 AND 运算符**（`&`）的工作方式与逻辑短路 AND 运算符（ `&&` ）相同，不同之处在于。 逻辑 AND 运算符（ `&` ）会求值其右侧操作数，即使其左侧操作数的求值结果为`false`。
> 2.  **逻辑或运算符** 的工作方式与逻辑短路或运算符相同，只是有一个区别。 逻辑或运算符将求值其右侧操作数，即使其左侧操作数的求值结果为`true`。

## 7\. 按位运算符

按位运算符**操纵其操作数的各个位**。 Java 定义了几个按位运算符，它们可以应用于整数类型`long`，`int`，`short`，`char`和`byte`。

| **运算符** | **描述符** |
| --- | --- |
| `'&'` | **二元与运算符**。如果位存在于两个操作数中，则将其复制到结果中。 |
| `'&#124;'` | **二元或运算符**。如果位存在于任一操作数中，则复制它。 |
| `'^'` | **二元 XOR 运算符**。如果在一个操作数中设置了位，但未在两个操作数中都设置，则会复制它。 |
| `'~'` | **二元补码运算符**。它是一元的，具有“翻转”位的作用。 |
| `<<` | **二元左移运算符**。 左操作数的值向左移动右操作数指定的位数。 |
| `>>` | **二元右移运算符**。 左操作数的值向右移动右操作数指定的位数。 |
| `>>>` | **右移零填充运算符**。 左操作数的值向右移动右操作数指定的位数，并且移位后的值用零填充。 |

## 8\. 三元运算符（`?:`）

*   Java 有一个条件运算符。 它被称为三元运算符，因为它需要**三个操作数**。`?:`的两个符号成为三元运算符。如果`boolean-expression`的计算结果为`true`，则计算为`true-expression`。 否则，它将求值`false-expression`。

#### 8.1 语法

```java
boolean-expression ? true-expression : false-expression

```

#### 8.2 三元运算符示例

```java
int number1 = 40;
int number2 = 20;

int biggerNumber = (number1 > number2) ? number1 : number2;

//Compares both numbers and return which one is bigger

```

## 9\. Java 运算符优先级表

Java 具有明确定义的规则，用于指定当表达式具有多个运算符时对表达式中的运算符求值的顺序。 例如，乘法和除法的优先级高于加法和减法。

> 优先规则可以由显式括号覆盖。

当两个运算符共享一个操作数时，优先级较高的运算符优先。 例如，将`1 + 2 * 3`视为`1 + (2 * 3)`，因为乘法的优先级高于加法。

在上面的表达式中，如果要首先添加值，则使用这样的显式括号 – `(1 + 2) * 3`。

| 优先顺序 | 运算符 | 类型 | 关联性 |
| --- | --- | --- | --- |
| 15 | `() [] .` | 括号、数组下标、成员选择 | 左到右 |
| 14 | `++ --` | 一元后自增、一元后自减 | 右到左 |
| 13 | `++ -- + – ! ~ (类型)`  | 一元前自增、一元前自减、一元加、一元减、一元逻辑否定、一元按位补码、一元类型转换 | 右到左 |
| 12 | `* / % `| 乘法、除法、模数 | 左到右 |
| 11 | `+ – ` | 加法、减法 | 左到右 |
| 10 | `<< >> >>>` | 按位左移、带符号扩展的按位右移、带零扩展的按位右移 | 左到右 |
| 9 | `< <= > >= instanceof` | 关系小于、关系小于或等于、关系大、关系大于或等于、类型比较（仅对象） | 左到右 |
| 8 | `== !=` | 关系不等于、关系不等于 | 左到右 |
| 7 | `&` | 按位与 | 左到右 |
| 6 | `^` | 按位异或 | 左到右 |
| 5 | <code>&#124;</code> | 按位或 | 左到右 |
| 4 | `&&` | Logical AND | 左到右 |
| 3 | <code>&#124;&#124;</code> | 逻辑或 | 左到右 |
| 2 | `?:` | 三元条件 | 右到左 |
| 1 | `= += -= *= /= %=` | 赋值、加法赋值、减法赋值、乘法赋值、除法赋值、模赋值 | 右到左 |

Java 中的**运算符**就这些了。

学习愉快！

阅读更多：

[Oracle Java 文档](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)

[链接](http://journals.ecs.soton.ac.uk/java/tutorial/java/nutsandbolts/operators.html)

[优先级表](http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html)